2011-12-19 3 views
1

두 가지 방법이 있습니다.다른 동기화 된 메서드 내에서 동기화 된 메서드 참조

두 메서드는 synchronized 메서드입니다. 하나의 메서드를 다른 메서드에서 호출하면 교착 상태가 발생합니까?

+1

두 클래스가 동일한 클래스에 속해 있습니까? – unholysampler

+0

잠금 개체에 따라 다릅니다. 인스턴스 메서드, 정적 메서드, 내부 동기화 된 블록이있는 메서드 등의 의미에 대한 자세한 내용을 제공 할 수 있습니까? – Thomas

답변

4

아니요, 두 가지 방법이 모두 동일한 클래스에 있고 (static 또는 둘 모두가 static이 아님) 가정합니다. synchronized 메서드는 입력하려는 스레드가 모니터 객체를 보유 할 수있을 때만 입력됩니다 (예 : this). 스레드가 이미 모니터를 획득 했으므로 더 이상 문제없이 두 번째 방법을 간단하게 입력 할 수 있습니다.

+0

그건 재진입 잠금이라고. – toto2

0

A에 대한 잠금을 획득하고 B을 잠 그려는 경우. Thread 2B에 잠금 장치가 있고 A에도 잠금을 설정하려고합니다. 이것은 교착 상태입니다. 그렇지 않으면 모든 것이 가능합니다.

0

그것은 따라 달라

  • 이러한 두 가지 (또는 그 이상)의 다른 개체,
  • 여러 스레드가 이러한 개체에 액세스하는 경우,
  • 와 이러한 개체의 잠금 순서가 달라질 수 있는지 방법을 동기화하는 경우 (한 경우 object1-> object2 및 다른 경우 object2-> object1)

그렇다면 교착 상태가 발생할 수 있습니다.

그러나 하나의 동일한 객체에서 동기화 된 메소드에 대해 이야기하는 경우 교착 상태가 발생하지 않습니다. 객체의 모니터는 재진입입니다. 이미 보유하고있는 경우 다시 모니터를 요청할 수 있습니다 (동일한 객체에 동기화 된 블록을 입력하십시오).

관련 문제