Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top