2012년 9월 26일 수요일

OCJP 문제풀이 - Question 3


QUESTION 3
Given:
void waitForSignal() {
  Object obj = new Object();
  synchronized (Thread.currentThread()) {
    obj.wait();
    obj.notify();
  }
}
Which statement is true?

A.This code can throw an InterruptedException.
B.This code can throw an IllegalMonitorStateException.
C.This code can throw a TimeoutException after ten minutes.
D.Reversing the order of obj.wait() and obj.notify() might cause this method to complete normally.
E.A call to notify() or notifyAll() from another thread might cause this method to complete normally.
F.This code does NOT compile unless "obj.wait()" is replaced with "((Thread) obj).wait()".

Answer: B
Section: All

Explanation/Reference:

  wait(), notify(), notifyAll() 은 synchronized 블록이나 메소드 내에서만 사용할 수 있는 메소드이다. 이 함수를 synchronized 블록 내에서 사용할 때는 synchronized 된 객체를 대상으로 사용하여야하는데, 위 예제는 synchronized 와는 상관없는 외부의 obj 객체의 wait() 메소드를 사용하였다.

  이와 같은 일이 수행되었을 경우 IllegalMonitorStateException 이 발생한다.

블로그 보관함