В частности, я использую lucene для выполнения полнотекстового поиска, и в некоторых случаях индексный файл может быть поврежден или просто еще не создан, и в этот момент я удаляю файл и переписываю индекс в указанный файл. Мой вопрос касается самого акта удаления и перезаписи в файл в многопоточной Java-программе.
Будет ли синхронизация защищать файл ввода-вывода при его удалении и восстановлении? Другими словами, заблокирует ли он доступ к другому потоку, пытающемуся использовать тот же метод, и начнет переписывать, когда он уже в процессе?
Метод setDirectory должен быть запущен до того, как сработают любые другие методы в классе (в противном случае он выдаст ошибки), поэтому защитит ли меня способ настройки синхронизации от любых многопоточных сбоев?
Когда другой поток пытается использовать метод setDirectory и метод buildCompleteIndex уже выполняется, поток просто будет ждать его завершения, а затем проверяет, существует ли путь, и переходит к открытию индекса.
В lucene мне нужно синхронизировать при записи, удалении или поиске в индексе или эти задачи можно выполнять одновременно?
public void setDirectory(int organizationId) throws IOException {
this.organizationId = organizationId;
File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
//If path does not exist, create it and create new index for organization
synchronized(this) {
if(!path.exists()) {
path.mkdirs();
buildCompleteIndex(organizationId, false);
}
}
this.directory = FSDirectory.open(path); //Open directory
}
private void buildCompleteIndex(int organizationId, boolean rebuildDir) {
if(rebuildDir) {
File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
try {
Utils.deleteDirectory(path);
} catch (IOException e) {
throw new LuceneIndexException("Error rebuilding index directory.", e);
}
path.mkdirs();
}
List<Tag> tagList = tagDAO.findAll(organizationId);
for(Tag tag : tagList) {
add(tag);
}
}