2017-12-13 16 views
-2

클래스 2의 여러 인스턴스 중 하나에서 상태 변경으로 연결되는 작업을 수행하는 경우가 있는데, 이는 멀티 스레드 응용 프로그램이므로이 특정 부분이 코드가 실행되면, 전술 한 2 개의 인스턴스 중 어느 하나에 액세스하려고 시도하는 다른 스레드 중 어느 것도 대기 상태가되지 않는다. 동기화 또는 잠금을 사용하면 단일 인스턴스에서 잠금을 획득하고 2 개의 객체에서 동기화 된 블록을 중첩 할 수 있습니다.Java에서 여러 객체 잠그기

synchronized(obj1){ 
synchronized(obj2){ 
} 
} 

또 다른 잠재적 인 문제는 내부 개체 obj2보다 무료 인 경우에도 경우 외부 객체가 스레드가 기다리고 계속 잠겨 있기 때문에, 경우가있을 수 있다는 것입니다. 이 문제에 대한 최선의 해결책은 무엇입니까?

+2

"2 개의 객체에 동기화 된 블록을 중첩하는 것은 좋은 생각이 아닙니다." 왜 안돼? 어떤 종류의 코드 경로가 있습니까? 결국 데드락을 피하기를 원한다. 그래서'obj2'가 자유 다 할지라도'obj1'이 그렇지 않은지 상관 없다. – Kayaman

+0

'sync (obj2) {sync (obj1) {...}} '와 같은 또 다른 코드가 있다면 문제가 될 것입니다. –

+1

왜 이것을해야합니까? 그들은 너무 독립적으로 잠겨 있습니까? 나는'Lock'을 사용하고 객체에 접근하기 전에 항상 그것을 잠그는 것을 제안 할 것이다. 또한'Lock'을 사용하면 순차적으로 잠금을 획득해야하는 경우에'tryLock'을 수행하여 교착 상태를 방지 할 수 있습니다. –

답변

1

중첩 된 잠금을 사용하면 다른 두 스레드가 서로 다른 순서로 잠글 때 교착 상태의 위험이 발생할 수 있습니다.

이러한 교착 상태를 제거하기위한 보편적 인 방법은 없습니다. 가능한 해결책에는 다음이 포함

  1. 잠금 객체 전체 순서를 유지하고 오직 개체의 오름차순으로 잠금을 획득 (또는 단지 내림차순).

    잠금 해제를 위해 두 개체를 모두 알 필요가없는 경우이 방법이 좋은 해결책입니다.

  2. 내측 잠금 장치에 tryLock 메커니즘을 사용합니다.

    tryLock은 객체가 이미 다른 스레드에 의해 잠겨 있으면 즉시 false를 반환합니다. 따라서 프로그램은이 사건을 어떻게 든 처리해야합니다.