Воспроизведение моего ответа от здесь (в случае его удаления) и добавление отзыва Джеффа Фостера:
Принимая во внимание, что создается исключение OverlappingFileLockException
, создается впечатление, что другой поток в том же процессе пытается заблокировать тот же файл. Это не конфликт между A и B, а скорее конфликт внутри B, если кто-то использует документацию API для метода lock () и когда условие, при котором он создает исключение OverlappingFileLockException:
Если блокировка перекрывает запрошенный
регион уже удерживается этой Java
виртуальная машина, или если другой поток
уже заблокирован в этом методе и
пытается заблокировать перекрытие
область того же файла
Единственное решение, предотвращающее это, состоит в том, чтобы любой другой поток в B не мог получить блокировку для того же файла или той же области перекрытия в файле.
У брошенного IOException
есть немного более интересное сообщение. Вероятно, это подтверждает приведенную выше теорию, но, не глядя на весь исходный код, я не могу ничего подтвердить. Ожидается, что метод lock
будет блокироваться до тех пор, пока не будет получена эксклюзивная блокировка. Если он был получен, то при чтении из файла не должно возникнуть никаких проблем. За исключением одного условия. Если файл уже был открыт (и заблокирован) одной и той же JVM в другом потоке с использованием объекта File (или, другими словами, второго / другого дескриптора файла), то попытка чтения первого дескриптора файла завершится неудачно, даже если если блокировка была получена (в конце концов, блокировка не блокирует другие потоки).
Усовершенствованный дизайн будет состоять в том, чтобы в каждом процессе имелся отдельный поток, который получает монопольную блокировку файла (при использовании одного объекта File или одного дескриптора файла) только в течение определенного периода времени, выполняя требуемое действие в файл, а затем снимите блокировку.
Как отметил Джефф, использование API-интерфейсов NIO, вероятно, приведет к решению проблемы. Это полностью связано с возможностью API FileReader, открывающего новый дескриптор файла , который отличается от того, для которого получена блокировка.