Блокировка и обновление файла соответственно - PullRequest
1 голос
/ 22 октября 2009

Примечание : я читал другие посты о том, как заблокировать и разблокировать файл. Я не нашел ничего особенного, о чем я не знал. Поэтому я приведу свой сценарий здесь, чтобы кто-то мог дать некоторые предложения.

По моему опыту, FileChannel.lock не гарантирует ситуацию блокировки и разблокировки файла, когда разные объекты из нескольких экземпляров jvm пытаются заблокировать и обновить файл.

Сценарий в моем приложении - есть три отдельные программы, которые обновляют файл. Эти программы запускаются на разных экземплярах jvm. Скажем, программы - A, B и C, а файл - F. Если A блокирует файл, F, B и C должны подождать, пока F не будет выпущен, прежде чем одна из других программ сможет его удержать. Это прекрасно работает, если программы запускаются на одном экземпляре jvm. К сожалению, это не работает в нескольких экземплярах jvm.

У меня была другая идея, которая заключалась в том, чтобы иметь плоский файл, в котором я указал бы, следует ли обновить F Содержимое этого плоского файла может быть ЗАБЛОКИРОВАНО или РАЗБЛОКИРОВАНО. По умолчанию / начальное значение будет разблокировано. Поэтому, когда одна из программ захочет обновить F, она должна увидеть флаг в плоском файле. Если флаг читает LOCKED, он должен подождать. Однако при таком подходе возникает проблема - что, если несколько программ открывают плоский файл ровно в одно и то же время и видят «UNLOCKED», или две программы, которые ожидали, пока плоский файл прочитает UNLOCKED, и в то же самое время увидят чтение файла » UNLOCKED "?

Есть идеи, ребята?

1 Ответ

3 голосов
/ 22 октября 2009

Если вам нужна блокировка в файловой системе, вы должны создать каталог. Каталог существует означает «заблокирован», отсутствующий каталог - разблокирован.

Причина в том, что создание и удаление каталогов должны быть атомарными операциями в любой файловой системе. Поэтому, как только два процесса попытаются создать один и тот же каталог, один из них получит ошибку.

...