Изменения FileLock между Java 5 и Java 6

В Java 1.5 java.nio.channels.FileLock не проверял наличие уже заблокированных файлов. ссылка здесь

Фрагмент гласит:

Класс java.nio.channels.FileLock проверяет файлы, уже заблокированные другими экземплярами FileChannel.

Java SE 6 генерирует исключение OverlappingFileLockException, если приложение пытается заблокировать область, которая перекрывает область, заблокированную через другой экземпляр FileChannel. Предыдущие версии не проверяли блокировки файлов, полученные другими экземплярами FileChannel. По умолчанию метод java.nio.channels.FileChannel.lock проверяет, не пересекается ли запрошенная блокировка с регионом, удерживаемым этой виртуальной машиной Java.

Таким образом, до Java 6 монопольная блокировка файлов не работала, если у вас было несколько программ, записывающих в один и тот же файл (каждая программа пыталась получить монопольную блокировку). Как люди обошли это с Java 5 и более ранними версиями?


person bogertron    schedule 16.06.2011    source источник


Ответы (1)


Я не думаю, что поведение Java5 является серьезной проблемой.

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

В JVM обычно есть много независимых пакетов, должны быть варианты использования, когда два пакета пытаются заблокировать один и тот же файл. Если им всем предоставлена ​​блокировка, у нас есть проблема. Трудно заставить два независимых пакета каким-либо образом сотрудничать, поэтому Java6 сужает право собственности от всего процесса до канала. (надеюсь, два пакета не будут использовать один и тот же канал)

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

person irreputable    schedule 16.06.2011