Я работаю над унаследованным проектом Java 1.4, и у меня есть фабрика, которая создает экземпляр синтаксического анализатора файла csv в качестве одиночного.
Однако в моем анализаторе CSV-файлов у меня есть HashSet, в котором будут храниться объекты, созданные из каждой строки моего CSV-файла. Все это будет использоваться веб-приложением, и пользователи будут загружать файлы CSV, возможно одновременно.
Теперь мой вопрос: каков наилучший способ предотвратить изменение моего списка объектов двумя пользователями?
Пока что я делаю следующее:
final class MyParser {
private File csvFile = null;
private Set myObjects = Collections.synchronizedSet(new HashSet);
public synchronized void setFile(File file) {
this.csvFile = file;
}
public void parse()
FileReader fr = null;
try {
fr = new FileReader(csvFile);
synchronized(myObjects) {
myObjects.clear();
while(...) { // foreach line of my CSV, create a "MyObject"
myObjects.add(new MyObject(...));
}
}
} catch (Exception e) {
//...
}
}
}
Должен ли я оставить блокировку только в наборе myObjects или объявить весь метод parse () как синхронизированный?
Кроме того, как я должен синхронизировать - оба - настройки csvFile и синтаксического анализа? Я чувствую, что мой реальный дизайн не работает, потому что потоки могут изменить файл csv несколько раз, пока выполняется, возможно, длительный процесс синтаксического анализа.
Надеюсь, я достаточно ясен, потому что сам немного запутался в этих проблемах мультисинхронизации.
Спасибо; -)