Блокировка и обновление файла соответственно

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

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам