2014-03-13 2 views
3

동기화 된 블록을 다른 개체와 동기화하기 위해 다른 블록 안에 포함해도됩니까?동기화 된 블록 내부의 동기화 된 블록

예 :

synchronized(myObjetc1){ 
    // code 
    synchronized(myObjetc2){ 
     // code   
    }   
} 

그렇다면, 여전히, 그것은 올바른 기술 또는 너무 위험하다?

+0

동기화 된 블록을 중첩 시키려면 매우 조심해야합니다. 대신 잠금을 사용하면 안전하다고 평가할 수 있습니다. – assylias

+0

자세한 내용은 Java 동시성 튜토리얼 http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html에서 확인할 수 있습니다. – SubOptimal

답변

10

다른 모든 곳에서 같은 순서로 동기화하면 문제가 없습니다.

다른 스레드가 다음 코드를

synchronized(myObjetc2){ 
    // code 
    synchronized(myObjetc1){ 
     // code   
    }   
} 

을 실행한다면 당신은 교착 상태를 얻을 수 있습니다.

위의 변수가 동일한 개체를 참조한다고 가정하면 다음과 같은 경우를 고려하십시오. 첫 번째 스레드 (사용자 코드)는 모니터를 myObjetc1에 잠급니다. 스레드 스케줄러는 스레드 컨텍스트를 전환합니다. 두 번째 스레드 (위의 코드)는 모니터를 myObjetc2에 잠급니다. 스레드 스케줄러는 스레드 컨텍스트를 전환합니다. 첫 번째 스레드는 myObjetc2에 모니터 잠금을 시도합니다. 두 번째 스레드가 가지고 있기 때문에 기다려야합니다. 스레드 스케줄러는 컨텍스트를 전환합니다. 두 번째 스레드는 모니터를 myObjetc1에 잠그려고 시도합니다. 첫 번째 스레드가 가지고 있기 때문에 기다려야합니다. 팔! 이중 자물쇠.

+0

'다른 스레드가 있으면 어떻게 해석 할 수 있습니까? – Kick

+0

@ Youngistan 그래, 추가 세부 정보. 감사. –

+1

당신은 모니터가 아니라 자물쇠를 사십시오. – Andres

1

네, 할 수 있습니다.

자물쇠 규칙을 준수하는 시간까지 귀하의 요구 사항 인 자물쇠를 해결할 때까지.

그러나 여러 번 잘못 입력하면 DeadLock 문제가 발생합니다.