2010-04-26 1 views
1

질문이 있습니다. 다음 코드에서 wait 문에서 스레드가 차단되고 다른 스레드가 foo()를 실행하려고하면 hello world 메시지가 인쇄됩니까? 그리고 왜?Java의 동기화 된 메서드

synchronized foo(){ 
    system.out.println("hello world"); 
    ..... 
    wait(); 
    ..... 
} 

답변

1

예.

wait(); 스레드 A가 wait()에서 차단되면 모니터를 포기합니다. 스레드 B는 foo를 입력하고 안녕하세요 세계를 인쇄 할 수 있습니다

3

스레드가 메서드 foo을 입력하려면 foo 메서드가 포함 된 개체 (모니터)에 잠금 장치가 있어야합니다. wait이 실행되면 스레드는 모니터에서 잠금을 해제합니다. 따라서 다른 스레드가 foo를 실행하려고 시도하면 (잠금을 획득 할 수 있다고 가정하면) "hello world"메시지가 인쇄됩니다.

+0

+1 '대기'로 인해 스레드가 모니터를 해제한다는 것을 알지 못했습니다. 그러나'notify'가 호출되면 모니터를 잠그는 것을 계속해야합니다 ... 기본적으로'synchronized' 메소드 내에서'wait'를 호출하는 것은 좋은 생각이 아닙니다. –

+4

@yar'synchronized' 메소드 내에서'wait'를 호출하는 것은 그것들 외부에서 호출하는 것보다 더 좋은 아이디어입니다. 객체의 락을 소유하지 않고'wait'를 호출하면'IllegalMonitorStateException'으로 끝납니다. –

+0

@ Tadeusz Kopec 오, 내 잘못. –

1

잠시 wait() 호출을 래핑하는 것이 좋습니다. 이유 : 산발적 인 깨우기!

+0

나는 이것으로 확신하지 않는다. 코드가'notifyAll'보다는'notify'를 사용하면 "산발적 인"깨우기는 코드의 버그의 결과입니다. 버그를 찾아 수정하는 것이 낫지 않습니까? –

+1

@Stephen - 가정이 맞지 않습니다. 산발적 인 깨우기는 OS가 스레드를 깨우는 제품 일 수 있습니다. 대기 시간을 잠그지 않는 것은 시한 폭탄입니다. 코드는 완벽하게 문제가 될 수 있으며 여전히 실패 할 수 있습니다. –

+0

@ John W - 일어날 수 있다고 Java 설명서에 표시 할 수 있습니까? –