Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

NIO блокирование файла

в примере я создаю 2 потока, которые пытаются получить лок на один и тот же файл , приведу пример 1 потока(2й аналогичный, с именем th2 и стартует сразу после 1го ):
Thread th1 = new Thread(new Runnable() { Object obj = new Object(); @Override public void run() { synchronized (obj) { FileLock lock = null; FileChannel fileChannel = null; try { fileChannel = FileChannel.open(new File("sample.txt").toPath(), StandardOpenOption.READ); lock = fileChannel.tryLock(0, 2, true); System.out.println("1acq by " + lock.acquiredBy()); System.out.println("1Lock acquired: " + lock.isValid()); System.out.println("1Lock is shared: " + lock.isShared()); System.out.println(" thread 1"); obj.wait(2000);
} catch (Exception e) { e.printStackTrace(); } finally { try { fileChannel.close(); lock.release(); } catch (IOException e) { e.printStackTrace(); } } } } });
th1.start();
Но на деле почему-то второму потоку не удается заполучить лок :
java.nio.channels.OverlappingFileLockException
Что за бред? в документации же написано, что shared lock на канале чтения можно взять одновременно и несколько!!!
PS файл существует и размер его достаточно большой
PPS удалось одновременно получить лок удалось только разным процессам! Почему!?


Ответ

в документации же написано, что shared lock на канале чтения можно взять одновременно и несколько!!!
Все правильно. С одной поправкой: блокировка файлов доступна только разным процессам. Т.е. пытаться взять лок на файл из разных потоков одного процесса -- некорректно. Если вы хотите гарантировать, что только один поток имеет доступ к файлу -- используйте обычный лок на объект. Из документации
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine.
shared lock всего лишь означает, что другой процесс не сможет взять exclusive lock, а только shared. Из документации
A shared lock prevents other concurrently-running programs from acquiring an overlapping exclusive lock, but does allow them to acquire overlapping shared locks.

Комментариев нет:

Отправить комментарий