Страницы

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

воскресенье, 15 марта 2020 г.

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

#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.

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

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