두 개의 공유 FileLock을 얻으려면 어떻게해야합니까? 나는 다음과 같은 테스트 코드가 있습니다하나의 JVM이 두 개의 공유 FileLock을 수신 할 수 있습니까?
File file = new File(lockDir, "tmp.lock");
file.createNewFile();
FileChannel channel = new RandomAccessFile(file, "r").getChannel();
boolean shared = true;
FileLock lock1 = channel.tryLock(0, Long.MAX_VALUE, shared);
assertTrue(lock1.isValid());
assertTrue(lock1.isShared());
// I get an OverlappingFileLockException here:
FileLock lock2 = channel.tryLock(0, Long.MAX_VALUE, shared);
assertTrue(lock2.isValid());
assertTrue(lock2.isShared());
lock1.release();
lock2.release();
을하지만 난 두 개의 서로 다른 스레드에서 잠금 aquiring을 실행하는 경우에도 표시된 줄에은 OverlappingFileLockException를 얻을. 또는 공유 잠금은 두 개의 서로 다른 프로세스에서만 가능합니까? 아니면 공유를 오해 했습니까? 그리고 파일의 일부분 ('파일 리소스 공유')에 대해 읽기 액세스 권한을 & 개 작성하는 것에 관한 것입니까? 내 유스 케이스의 사용 가능 여부에 대한 문서를 실제로 찾을 수 없습니다.
new ReentrantReadWriteLock()
에 대해 .readLock()
및 .writeLock()
을 사용하는 파일 기반 잠금에 대해 동일한 동작을하고 싶습니다. 여러 개의 읽기 잠금이 허용되지만 하나의 쓰기 잠금 만 허용됩니다. - 요구 된 영역을 오버랩 잠금이 이미 자바 가상 머신에 의해 보관 유지되고있는 경우, 또는 다른 스레드가 이미이 방법을 차단하고 있습니다 경우
tryLock
이
OverlappingFileLockException
발생 : 자바 문서에서
뭐 t 플랫폼에서 실행 중입니까? [JavaDocs :] (http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html)에서 "일부 플랫폼은 공유 잠금을 지원하지 않습니다.이 경우 공유 잠금이 지원되지 않습니다. 공유 잠금은 배타적 잠금에 대한 요청으로 자동 변환됩니다. " –
우분투,하지만 그것에 대해 아무런 지원이 믿을 수 없어 – Karussell
사실'assertTrue (lock1.isShared())가 통과하면 아마 문제가되지 않습니다. –