2013-10-07 2 views
0

는 교착 상태가 될 것입니다, 우리는 객체 O를 다른 스레드가 잠금을 획득하는 경우이 시간에, ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ, 객체 O를 해제 잠금 현재 실행중인 스레드를 실행하는 동안다른 스레드가이 클래스의 정적 동기화 된 메서드를 실행할 때 스레드가 클래스의 인스턴스에 대한 잠금을 획득 할 수 있습니까?

class A { 
    void m1() { 
     synchronized (this) { 
     } 
     blah blah blah 
     synchronized (this) { 
     } 
    } 
} 

내 의심의 여지가 있다고 가정합니다. 그렇다면 동기화 된 메서드 대신 동기화 된 블록을 사용해야한다고 어떻게 말할 수 있습니까?

클래스 레벨 잠금을 획득하는 정적 동기화 메소드를 실행하는 스레드 t1이 다른 동기화 된 메소드를 실행하기 위해이 클래스의 인스턴스 잠금을 다른 스레드가 획득 할 수 있습니까?

답변

2

"blah blah blah"를 실행하는 동안 현재 실행중인 스레드는 잠금을 소유하지 않습니다. 다른 스레드가 객체에 대한 잠금을 획득 할 수는 있지만 교착 상태가 발생하지는 않습니다. 첫 번째 스레드는 다른 스레드가 잠금을 해제 할 때까지 단순히 차단합니다.

스레드 A가 스레드 1을 소유하고 있지만 스레드 2는 스레드 2가 필요하지만 스레드 2는 스레드 2를 소유하고 있지만 잠금 1을 필요로 할 때 교착 상태가 발생합니다. 사용자 상황에서는 발생하지 않습니다.

클래스 수준 잠금은 개체 인스턴스 잠금과 다른 잠금입니다. 따라서 클래스 수준 잠금은 객체의 다른 동기화 된 메서드를 실행하는 다른 스레드와 간섭하지 않습니다.

+0

+1 걱정할 점은 클래스 수준의 잠금이 있고 인스턴스가 잠기는 경우 두 잠금의 잠금 순서에 따라 교착 상태가 발생할 수 있다는 것입니다. – Gray

2

예. 개체의 동기화는 개체 클래스의 Class<?> 개체의 동기화와 완전히 독립적입니다.