2009-10-22 3 views
1

참고 : 파일 잠금 및 잠금 해제 방법에 대한 다른 게시물을 읽었습니다. 나는 내가 모르는 특별한 것을 발견하지 못했다. 그래서 누군가가 제안을 할 수 있도록 시나리오를 작성하려고합니다.따라서 파일 잠금 및 업데이트

내 경험상 FileChannel.lock은 jvm의 여러 인스턴스에서 다른 Object가 파일을 잠그고 업데이트하려고 할 때 File의 잠금 및 잠금 해제 상황을 보장하지 않습니다.

내 응용 프로그램의 시나리오는 다음과 같습니다 - 파일을 업데이트하는 세 개의 별도 프로그램이 있습니다. 이러한 프로그램은 다른 jvm 인스턴스에서 실행됩니다. 프로그램이 A, B 및 C이고 파일이 F라고 가정 해보십시오. A가 파일 F를 잠근 경우 B와 C는 다른 프로그램 중 하나가 보류 상태가되기 전에 F가 해제 될 때까지 기다려야합니다. 프로그램이 동일한 jvm 인스턴스에서 실행되는 경우이 작업은 정상적으로 작동합니다. 불행히도 이것은 여러 개의 jvm 인스턴스에서 작동하지 않습니다.

나는 F가 업데이트되어야 하는지를 나타내는 플랫 파일을 가지고 있다는 또 다른 아이디어가있었습니다. 해당 플랫 파일의 내용은 LOCKED 또는 UNLOCKED 일 수 있습니다. 기본값/초기 값은 UNLOCKED입니다. 따라서 프로그램 중 하나가 F를 업데이트하려는 경우 플랫 파일에서 플래그를 확인해야합니다. 플래그가 LOCKED를 읽으면 기다려야합니다. 이 접근법에는 문제가 있습니다 - 여러 프로그램이 정확히 동시에 플랫 파일을 열고 "UNLOCKED"또는 플랫 파일을 읽으려고 기다리고 있던 두 개의 프로그램이 UNLOCKED이고 정확하게 동시에 파일이 " UNLOCKED "?

아무 생각 없나요?

+1

Lucene의 org.apache.lucene.store.Lock 구현 (예 : SimpleFSLock 및 NativeFSLock)을 본 적이 있습니까? 그 수업은 똑같은 목적으로 만들어 지므로, 거기에서 몇 가지 아이디어를 얻을 수 있습니다. – sfussenegger

+0

소리가 멋지다. 나는 한번 살펴볼 것이다. 대단히 감사합니다. – DragonBorn

답변

3

파일 시스템에서 잠금이 필요한 경우 디렉토리를 만들어야합니다. 디렉토리가 존재한다는 것은 "잠긴"을 의미하고, 누락 된 디렉토리는 잠금 해제를 의미합니다.

디렉토리를 생성하고 삭제하는 것이 모든 파일 시스템에서 원자 적 조작이어야한다는 이유가 있습니다. 따라서 두 프로세스가 동일한 디렉토리를 만들 자마자 그 중 하나에서 오류가 발생합니다.

+0

EDITED : 다른 프로그램이 파일의 내용을 읽을 수 있어야하므로 디렉토리를 만드는 것이 옵션이 아닙니다. 잠금/잠금 해제는 업데이트 중에 만 발생합니다. – DragonBorn

+0

왜 이것이 옵션이 아닌가요? 다른 프로그램은 디렉토리에 대해 신경 쓸 필요가 없습니다 (그 디렉토리에 파일을 넣을 필요는 없습니다). – sfussenegger

+0

내가 틀렸다고 정정 해주세요. 따라서 파일을 잠그지 않고 파일을 업데이트해야 할 때 디렉터리를 만들고 잠글 수 있습니까? – DragonBorn