Синхронизация при удалении или обновлении файла ввода-вывода - PullRequest
1 голос
/ 23 марта 2012

В частности, я использую 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...