동기화 된 블록을 다른 개체와 동기화하기 위해 다른 블록 안에 포함해도됩니까?동기화 된 블록 내부의 동기화 된 블록
예 :
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
그렇다면, 여전히, 그것은 올바른 기술 또는 너무 위험하다?
동기화 된 블록을 다른 개체와 동기화하기 위해 다른 블록 안에 포함해도됩니까?동기화 된 블록 내부의 동기화 된 블록
예 :
synchronized(myObjetc1){
// code
synchronized(myObjetc2){
// code
}
}
그렇다면, 여전히, 그것은 올바른 기술 또는 너무 위험하다?
다른 모든 곳에서 같은 순서로 동기화하면 문제가 없습니다.
다른 스레드가 다음 코드를
synchronized(myObjetc2){
// code
synchronized(myObjetc1){
// code
}
}
을 실행한다면 당신은 교착 상태를 얻을 수 있습니다.
위의 변수가 동일한 개체를 참조한다고 가정하면 다음과 같은 경우를 고려하십시오. 첫 번째 스레드 (사용자 코드)는 모니터를 myObjetc1
에 잠급니다. 스레드 스케줄러는 스레드 컨텍스트를 전환합니다. 두 번째 스레드 (위의 코드)는 모니터를 myObjetc2
에 잠급니다. 스레드 스케줄러는 스레드 컨텍스트를 전환합니다. 첫 번째 스레드는 myObjetc2
에 모니터 잠금을 시도합니다. 두 번째 스레드가 가지고 있기 때문에 기다려야합니다. 스레드 스케줄러는 컨텍스트를 전환합니다. 두 번째 스레드는 모니터를 myObjetc1
에 잠그려고 시도합니다. 첫 번째 스레드가 가지고 있기 때문에 기다려야합니다. 팔! 이중 자물쇠.
네, 할 수 있습니다.
자물쇠 규칙을 준수하는 시간까지 귀하의 요구 사항 인 자물쇠를 해결할 때까지.
그러나 여러 번 잘못 입력하면 DeadLock 문제가 발생합니다.
동기화 된 블록을 중첩 시키려면 매우 조심해야합니다. 대신 잠금을 사용하면 안전하다고 평가할 수 있습니다. – assylias
자세한 내용은 Java 동시성 튜토리얼 http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html에서 확인할 수 있습니다. – SubOptimal