Проблема с механизмом блокировки файлов Java (FileLock и т. Д.) - PullRequest
4 голосов
/ 19 марта 2010

Я создаю простое приложение для открытия и редактирования XML-файлов.Эти файлы находятся в локальной папке, доступ к которой осуществляется несколькими экземплярами приложения.Я хочу заблокировать каждый файл, который открывается экземпляром приложения, чтобы другие экземпляры не могли получить к нему доступ.

Для этого я использую следующий код:

function voidreadFile () {

   File xmlFile = new File("myFile.xml");
   RandomAccessFile raf = new RandomAccessFile(xmlFile, "rw");
   FileLock fl = raf.getChannel().tryLock();

   if(fl==null){
       System.out.println("file already locked by another instance");
   }else{
       setCurrentFile(raf);
       setLock(fl);
       System.out.println("file successfully locked by this instance");
   }  

}

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

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

Я заметил следующую странную вещь:

Если после получения блокировки файла я открываю FileInputStream для того же файла, даже если объект FileLock остается действительным(isValid возвращает true), другие экземпляры приложения теперь могут получить доступ к редактируемому файлу.

Я считаю это поведение странным.Кто-нибудь может объяснить, почему это происходит?

Надеюсь, вышесказанное имеет смысл.Заранее спасибо!

1 Ответ

7 голосов
/ 19 марта 2010

Из FileDock JavaDocs:

То, блокирует ли блокировка на самом деле доступ другой программы к содержимому заблокированной области, зависит от системы и поэтому не указано.

Ваша платформа обеспечивает только рекомендательную блокировку. Удержание консультативной блокировки не помешает другим процессам получить доступ к файлу.

Таким образом, блокировка файла - это просто вывешивание знака «Не беспокоить», но оставление двери незапертой. Если все читают и почитают знак, вы хороши, но это не мешает никому просто войти.

JavaDocs также явно заявляет:

Блокировки файлов хранятся от имени всей виртуальной машины Java. Они не подходят для управления доступом к файлу несколькими потоками на одной виртуальной машине.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...