Насколько безопасно использовать Java FileLock?

Насколько безопасно использовать java.nio. channels.FileLock для блокировки файлов между процессами? Утверждается, что другие процессы не могут получить доступ к файлу, если у нас есть эксклюзивная блокировка. Однако в приведенном ниже ответе на другой SO вопрос говорится, что другие процессы должны проверять filelock тоже, чтобы наш процесс был безопасным.

(a) Знаете ли вы, что блокировка файла не помешает другим процессам прикасаться к нему, если они также не используют блокировки?

Итак, я проверил свой код и попытался изменить файл, который у меня уже заблокирован, с помощью текстового редактора Windows, и я был в безопасности, но не при тестировании с помощью Notepad++ ..

Есть ли решение для правильной блокировки файла в Java 6?


person Guillotine1789    schedule 14.01.2016    source источник
comment
См. также: > stackoverflow.com/questions/23562369/   -  person Raedwald    schedule 14.01.2016
comment
@Raedwald Это как-то помогло, спасибо.   -  person Guillotine1789    schedule 19.01.2016
comment
Это не указано. Ваш вопрос основан на ложной предпосылке.   -  person user207421    schedule 03.02.2016


Ответы (3)


Java FileLock использует рекомендательные (не обязательные) блокировки на многих платформах. Это означает, что он может обеспечивать блокировку только для других приложений, которые также используют FileLock (или эквивалент на других языках).

Ни Linux, ни Windows не реализуют обязательную блокировку по всем направлениям. Например:

  • Для Linux и подобных систем блокировка файлов носит только рекомендательный характер.

  • #P4# <блочная цитата> #P5# #P6#

Насколько безопасно использовать Java FileLock?

Если вы на самом деле спрашиваете, безопасно ли предположить, что FileLock обеспечивает обязательную блокировку файлов по отношению ко всем другим приложениям (Java и не-Java) независимо от того, как они написаны, ответ будет «Нет». Небезопасно делать такое предположение. .


Есть ли решение для правильной блокировки файла в Java 6?

Только если все приложения (Java и другие) взаимодействуют; например с помощью FileLock или эквивалента.

Если вы не можете сделать такое предположение, нет решения с использованием переносимой Java. Действительно, на большинстве (если не на всех) распространенных платформах ОС решения вообще нет, AFAIK ... потому что сама платформа не поддерживает обязательную блокировку файлов независимо от приложения.

person Stephen C    schedule 14.01.2016
comment
В системах Unix можно с уверенностью предположить, что это рекомендательные блокировки POSIX: stackoverflow.com/questions/23562369/ - person Raedwald; 14.01.2016

Из документа Javadoc java.nio.channels.FileLock в разделе «Зависимости от платформы»:

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

Как вы узнали из тестирования, другой не-Java-код, работающий в вашей версии Windows, не должен соблюдать вашу монопольную блокировку.

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

person Gilbert Le Blanc    schedule 14.01.2016

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

Это указано где? Не в Javadoc.

Однако в приведенном ниже ответе на другой [SO-вопрос] [2] говорится, что другие процессы также должны проверять наличие блокировки файла, чтобы наш процесс был безопасным.

Это правильно.

Итак, я проверил свой код и попытался изменить файл, который у меня уже заблокирован, с помощью текстового редактора Windows, и я был в безопасности, но не при тестировании с помощью Notepad++ .

Вы уже делаете что-то недопустимое, тестируя на одной платформе, где блокировки файлов влияют на обычные открытия, но единственный вывод, который можно сделать из этого, — это небезопасно. Notepad++ держит файл открытым и поэтому обнаруживает ваши блокировки, но текстовый редактор Windows этого не делает и поэтому также не видит блокировки, пока вы не попытаетесь сохранить.

Есть ли решение для правильной блокировки файла в Java 6?

Нет, если приложения, против которых вы блокируете, также используют блокировки файлов.

person user207421    schedule 14.01.2016
comment
В java.nio.channels.FileChannel метод tryLock возвращает: объект блокировки, представляющий недавно полученную блокировку, или null, если блокировку невозможно получить, поскольку другая программа удерживает перекрывающуюся блокировку. но выдает исключение, если блокировка, перекрывающая запрошенную область, уже удерживается этой виртуальной машиной Java, или если другой поток уже заблокирован в этом методе и пытается заблокировать перекрывающуюся область - person Guillotine1789; 14.01.2016
comment
@Guillotine1789 Guillotine1789 Если это предназначено для поддержки вашего утверждения, начинающегося с «заявлено ...», это не так. Если нет, то актуальность ускользает от меня. - person user207421; 15.01.2016
comment
Извините за поздний ответ, как это не связано? Думали о другой программе как о другом процессе? - person Guillotine1789; 19.01.2016
comment
Вы написали: «Указано, что другие процессы не могут получить доступ к файлу, если у нас есть монопольная блокировка». В приведенной выше цитате ничего не говорится о доступе или о том, что другие процессы могут и не могут делать. - person user207421; 01.02.2016