#java #concurrency
в примере я создаю 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 удалось одновременно получить лок удалось только разным процессам! Почему!?
Ответы
Ответ 1
в документации же написано, что 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.
Комментариев нет:
Отправить комментарий