2012-08-15 3 views
7

내가 알고 연구 한 바에 따르면 Java의 synchronized 키워드를 사용하면 메서드 또는 코드 블록 문을 동기화하여 멀티 스레드 액세스를 처리 할 수 ​​있습니다. 멀티 스레드 환경에서 쓰기 목적으로 파일을 잠그고 싶다면 Java NIO package의 클래스를 사용해야 최상의 결과를 얻을 수 있습니다. 어제, 파일 I/O 작업을 위해 공유 서블릿을 처리하는 것에 관한 질문을 제기했으며, BalusC 주석은 솔루션을 도울 수 있지만 this answer의 코드는 나를 혼란스럽게합니다. 나는 커뮤니티에 "그 포스트를 불 태워라"또는 "그에게 downvote하자"라고 물어 보지 않는다. (노트 : 나는 그것을 떨어 뜨리지 않았고, 아무것도 대답하지 않았다.) 나는 코드 조각이 가능하다면 설명을 요구한다. 좋은 연습으로 간주 될 수파일 개체 동기화

private static File theFile = new File("theonetoopen.txt"); 

private void someImportantIOMethod(Object stuff){ 
    /* 
     This is the line that confuses me. You can use any object as a lock, but 
     is good to use a File object for this purpose? 
    */ 
    synchronized(theFile) { 
     //Your file output writing code here. 
    } 
} 
+1

+1 이제 4000을 넘었습니다. – Hassan

+1

@Hassan 누구든지 그 명성이 무엇이든 그 질문/답변이 도움이된다고 느낄 때까지하지 마십시오. –

+0

@ Nandkumar 나는이 질문을 좋아한다. 나는 그저 재미 있다고 생각했다. – Hassan

답변

4

문제는 File 객체에 잠금에 대해하지 않습니다 - 당신은 어떤 개체에 잠글 수 있으며 (어느 정도) 정말 중요하지 않습니다.

최종 결과가 아닌 모니터를 사용하고 있기 때문에 코드의 다른 부분에서 파일 : theFile = new File();을 다시 할당하면 다음에 나오는 스레드가 다른 객체로 잠기고 아무런 보증도하지 않습니다. 귀하의 코드는 더 이상 동시에 2 스레드에 의해 실행되지 않습니다.

theFile이 최종적이었던 경우, 개인용 모니터를 사용하는 것이 바람직하지만 코드를 다른 잠금 목적으로 사용하는 코드가 없는지 확인하는 것이 좋습니다.

+0

그래, 나는이 사건의 자물쇠가 파일 (별다른 의미가없는 '결승전'을 제외하고는)이라는 사실은 중요하지 않다고 확신한다. JRE 토지와 파일 시스템 토지 사이에 (아마도) 하나가 아닌 경우에는 JRE 토지와 파일 시스템 토지 사이의 연결을 암시하기 때문에 혼란스러운 코드 일 수 있습니다. – dsummersl

+0

예, [최종 동기화] 게시물 (http://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html) 게시물에 명시된 바와 같이 '최종'키워드가 차이를 만듭니다.). 나를 혼란스럽게 만들었던 것은'File' 객체를 사용하여 코드 블록을 잠그는 것이 었습니다. 사실 자바 잠금과 파일에 대한 OS 잠금에 대해 혼란 스러웠습니다. 그러나 이러한 잠금은 매우 다릅니다. –

1

본 적이 있 었는가 : final Object lock = new Object() 물어볼 것입니까?
@assylias는 잠금이 final이 아님을 지적했습니다.

1

Java의 모든 객체는 동기화를위한 잠금 역할을 할 수 있습니다. 그것들은 내재적 자물쇠라고 부릅니다. 한 번에 하나의 스레드만이 주어진 잠금에 의해 보호되는 코드 블록을 실행할 수 있습니다. 그에

더 : http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

응용 프로그램의 성능에 영향을 줄 수있는 모든 방법 동기화 된 키워드를 사용. 그래서 때때로 동기화 된 블록을 사용할 수 있습니다.

잠금 참조는 변경할 수 없습니다. 가장 좋은 해결책은 최종 키워드를 사용하는 것입니다.

2

단일 응용 프로그램 내에서 파일을 잠그기 만하면 OK입니다 (final이 추가되었다고 가정).

다른 클래스 로더를 사용하여 클래스를 두 번 이상로드하면 솔루션이 작동하지 않습니다. 예를 들어 동일한 웹 서버에 두 번 배포되는 웹 응용 프로그램이있는 경우 응용 프로그램의 각 인스턴스에는 자체 잠금 객체가 있습니다.

언급했듯이 잠금을 강력하게하고 다른 프로그램에서도 파일을 잠그려면 FileLock을 사용해야합니다 (일부 시스템에서는 문서를 참조하여 모든 프로그램이 잠금을 준수해야한다는 보장은 없습니다) .