Блокировка файла на чтение с использованием замка или потока?

Существуют многочисленные файлы очень большого размера. Доступ к каждому файлу осуществляется в много поточном режиме. Один файл в один момент обрабатывается одним потоком. Вопрос как правильно осуществить эксклюзивное обращение к файлу. Вариант 1. используя lock на объекте FileChannel. Вариант 2. используя метод join на обрабатывающем потоке. Вариант 3. какой-то лучший способ блокирования файла для обработки


часть кода

    public static ByteBuffer getByteBufferFromFile(String fileName) throws IOException {
           try (FileChannel fileChannel=new RandomAccessFile(fileName,"rw").getChannel()){
          
          **FileLock lock = fileChannel.tryLock(0, fileChannel.size(), true);**
           int bufferedSize= fileChannel.size() > Integer.MAX_VALUE? 0 : (int)fileChannel.size();
           MappedByteBuffer buf= fileChannel.map(MapMode.READ_WRITE ,0, bufferedSize);
           ByteBuffer result= ByteBuffer.allocate(bufferedSize);
           buf.put(result) ;
           **lock.release();**
           fileChannel.close();
           return result;   
    } 

Вариант 2.

Thread task1 =  new Thread(getFileTask); 
task1.start();
**task1.join();**
Thread task2 = new Thread(getFileTask);
task2.start();
**task2.join();**


 

Ответы (1 шт):

Автор решения: user1715296

FileLock это платформо-зависимый лок для файла в операционной системе, он может потребоваться, если с файлом работает несколько процессов одновременно. Если у вас файл обрабатывается одним только вашим приложением, то логично использовать ReentrantLock или ReadWriteLock, экземпляр которого вы будете хрнить для каждого файла, с которым работает ваша программа.

→ Ссылка