2012-07-23 2 views
2

나는 자바 파일 잠금에 대한 약간의 혼란이있다.자바가 동시에 스레드간에 파일을 액세스

여기가 내 상황입니다.

  1. 각 스레드는 파일을 읽고 쓸 수 있습니다.
  2. 내 파일을 조작하는 방법은 스레드로 파일에는 동시 쓰기, 내 목표는 분명하다, 동시에

및 여러 스레드에서 호출 할 수 없습니다. 항상 하나의 스레드가 파일을 쓸 수 있습니다.

내 질문 있습니다

  1. FileOutputStream.write()는 스레드 안전하다고, 내가 잠긴까지 차단됩니다) 쓰기 (의 코드 때문에 내 코드에서 동시성 메커니즘을 넣어하지 않았다 파일이 공개됩니다. 그러나 스레드가 파일을 열 때 내 프로그램이 차단되지 않는 것 같습니다 (이 문제는 확실하지 않습니다)

  2. FileOutputStream.write()가 스레드로부터 안전하지 않은 경우, 추가 코드를 작성해야합니다. 한 번에 스레드 만 액세스하는 파일 따라서 FileChannel.lock()을 사용했습니다. 그러나 JDK 문서와 다른 점은 차단하지 않고 OverlappingFileLockException을 던집니다.

귀하의 명확한 조언을 부탁드립니다.

+0

FWIW FileChannel # lock은 다른 프로세스를 잠그는 것입니다 * 같은 JVM의 스레드간에 동기화하지 않기 위해 : http://stackoverflow.com/questions/128038/how-can-i-lock-a-file-using -java-if-possible – Thilo

+0

참조 해 주셔서 감사합니다. 그래서 .. FileChannel.lock()은 스레드가 아닌 프로세스에서만 유효합니까? 그리고 나는 정말로 동기화 접근법을 사용해야합니다 ... 맞습니까? –

답변

1

스레드로부터 안전하지 않으므로 프로그래밍 방식으로 안전을 보장해야합니다. 앱에 대한 주요 성능 요구 사항이 없다고 가정하면 관련 코드를 동기화 된 블록에 넣으면됩니다.

+0

메서드에서 동기화 된 블록이 언급 한 것처럼 내 옵션이 아닙니다. 파일 읽기/쓰기는 내 앱에서 중요한 작업입니다. 각 스레드가 다른 파일에 액세스하는 경우 동기화 할 필요가 없습니다. 최소한의 추가 코드로 파일을 열면 write() 메서드가 차단되기를 바랍니다. 가능하지 않은 경우 파일이 다른 스레드 (예 : 문자열 일치 ... 등)에 의해 액세스되는지 여부를 확인해야합니다. –

+0

동기화 된 블록에 파일을 나타내는 일부 개체를 잠금으로 사용할 수 있습니다. 글로벌 일 필요는 없습니다. – Thilo

관련 문제