2014-06-23 3 views
1

두 개의 공유 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 발생 : 자바 문서에서

+0

뭐 t 플랫폼에서 실행 중입니까? [JavaDocs :] (http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html)에서 "일부 플랫폼은 공유 잠금을 지원하지 않습니다.이 경우 공유 잠금이 지원되지 않습니다. 공유 잠금은 배타적 잠금에 대한 요청으로 자동 변환됩니다. " –

+0

우분투,하지만 그것에 대해 아무런 지원이 믿을 수 없어 – Karussell

+0

사실'assertTrue (lock1.isShared())가 통과하면 아마 문제가되지 않습니다. –

답변

0

중복 지역을

편집을 잠그면 : 나는 조건을 가정 만난 나는 귀하의 경우는 중복되는 지역이다, 당신은 단지 파일을 생성하고, 아무것도 포함하지 않기 때문에