2016-02-26 5 views
-1

Я работаю над программой на Java, где требуется блокировка чтения/записи. Сценарий - это несколько процессов, которые могут записываться в файл одновременно. Для блокировки файла я использовал следующую строку.Acquring блокировки чтения/записи в Java с использованием FileLock

FileOutputStream fos = new FileOutputStream(file); 
FileLock lock = fos.getChannel().lock; 

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

Может кто-нибудь помочь мне в этом. (Это работает на нескольких процессах, а также потоки)

+0

Один взгляд на [документация] (https://docs.oracle.com/javase/8/docs/api/java/nio/channels/FileChannel.html#lock--) показал бы, что 'lock () 'получает эксклюзивный замок. – VGR

ответ

0

Попытки использовать другую форму FileChannel#lock метода

public abstract FileLock lock(long position, long size, boolean shared) 

использовать этот метод с последним shared параметра с true значения, как этого

FileLock lock = fos.getChannel().lock(0L, Long.MAX_VALUE, true); 

As описанный параметр shared в JavaDoc

поделился - true, чтобы запросить общую блокировку, и в этом случае этот канал должен быть открыт для чтения (и, возможно, записи); ложь просить эксклюзивную блокировку, и в этом случае этот канал должен быть открыт для записи (и, возможно, чтение)

По умолчанию параметр имеет значение false и файл разделяется исключительно.

 Смежные вопросы

  • Нет связанных вопросов^_^