в примере я создаю 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.
Комментариев нет:
Отправить комментарий