2
public void method(Type1 inst1, Type2 inst2) { 
    synchronized(inst1) { 
    synchronized(inst2) { 
     //do something now 
    } 
    } 
} 

, 그것은 INST1에 잠금을 획득하고 그 로크를 해제 INST1없이 INST2에 로크를 획득한다. 나는이 두 객체가 다른 스레드에 의해 잠겨지지 않는다고 가정한다.

이 경우처럼 스레드가 두 객체에서 동시에 잠금을 획득 할 수 있습니까? I 일단 스레드있어서 진입이 코드 부분에서 이해할 수

  1. 한 번에 하나의 객체에 대한 잠금을 획득 할 수 있으며 현재 오브젝트에 대한 잠금이 해제 된 경우에만 다른 잠금을 소유 할 수 스레드, 어떻게 이 코드 조각이 아니라 유효하거나 할 수있는 경우이며, 그것은 내가 어딘가에서 본 유효한 코드일까요?
  2. Type1과 Type2가 같은 경우 어떻게됩니까?
  3. 메서드의 매개 변수 형식이 아닌 클래스 에있는 것으로 간주하여 메서드를 동기화하면 어떻게됩니까?
+1

이론적으로 스레드가 보유 할 수있는 잠금 수에는 제한이 없습니다.'synchronized '를 사용하여 얻은 잠금은 내재적으로 재진입이므로 동일한 객체를 참조하는'inst1' 및'inst2'에는 아무런 문제가 없습니다. 나는 이것이 숙제의 일종이라고 생각한다. 생각해 보려고하는 것은 데드 록입니다. 스레드 1이이 메소드를 호출하여 'objA'와 'objB'를 전달하면 스레드 2는 'objB'와 'objA'를 ​​동시에 호출합니다. –

+0

교착 상태를 설명하는 데 일반적으로 사용되는 코드입니다. 동의하다. 하지만 스레드가 한 번에 하나의 객체 만 잠글 수 있으며 해제하지 않고 다른 객체에 대한 잠금을 획득 할 수 없다는 것을 기억하는 한 일부 텍스트를 읽었습니다. 그게 내 의심이야! – xploreraj

+2

각 스레드가 한 번에 하나의 잠금 만 보유 할 수 있으면 교착 상태가 발생하지 않습니다. 읽은 내용을 잘못 이해했거나 읽은 내용이 잘못되었습니다. 누군가가 블로그 나 신문에 썼기 때문에 심지어 책은 진실을 주장하지 않습니다. –

답변

3

1. 스레드가 한 번에 하나의 객체에서만 잠금을 획득 할 수 있고 현재 객체의 잠금이 해제되었을 때 다른 잠금을 소유 할 수있는 경우이 코드는 어떻게 유효 할 수 있습니까? 아니면 내가 본 것 같은 유효한 코드입니까? 어딘가에?

IT는 잠금 방법이있는 개체에없는 유효한 코드이지만 inst1inst2에서와. 또한 잠금 장치는 클래스에있는 것이 아니라 모든 개체에 적용됩니다.

2. Type1과 Type2가 같은 경우 어떻게됩니까?

다시 잠금은 클래스가 아닌 개체에 있습니다. inst1과 inst2가 동일하면 스레드에 하나의 잠금 만 있고 동일한 스레드가 잠금을 "다시"입력하는 것이 유효합니다.

3. 메소드의 매개 변수 유형이 아닌 클래스에있는 것을 고려하여 메소드를 동기화하면 어떻게됩니까?

그런 다음 메서드가 실행되는 개체 (클래스가 아님)에 대해 다른 잠금이 설정되었습니다.

+0

동시에 여러 객체에 단일 스레드 잠금을 설정할 수 있습니까? – xploreraj

+1

예, 하나의 스레드가 두 개 이상의 잠금을 가질 수 있습니다. – morgano

0

동일한 순서로 수행하는 두 객체에 잠금을 설정할 때마다 코드에 문제가 없습니다. 예를 들어

, 당신은 두 가지 방법

public void methodA(Type1 inst1, Type2 inst2) { 
    synchronized(inst1) { 
    synchronized(inst2) { 
     //do something now 
    } 
    } 
} 

public void methodB(Type1 inst1, Type2 inst2) { 
    //wrong 
    synchronized(inst2) { 
    synchronized(inst1) { 
     //do something now 
    } 
    } 
} 

이있는 경우 다른 스레드가 INST2의 잠금있는 동안 당신은, INST1에 대한 잠금을 획득하고 INST2의 잠금을 기다릴 수 스레드로 잠재적 교착 상태에 문제가 그리고 inst1에 대한 잠금을 기다립니다. 및 @Nick 홀트 @morgano

+0

괜찮 았지만 이것이 의심의 여지가 아닙니다! 스레드가 두 개체를 동시에 잠그는 방법에 의문을 가지고 있습니다. – xploreraj

0

덕분에, 나는 스레드가 동시에 (다른 개체)를 여러 잠금을 보유 할 수 이해, 또는 동일한 개체를 여러 번 (얻은 잠금에 synchronized이 사용 암묵적으로 재진입).