FileLock меняется между Java 5 и Java 6 - PullRequest
3 голосов
/ 17 июня 2011

В 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 и раньше?

1 Ответ

1 голос
/ 17 июня 2011

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

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

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

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

...