Is Spurious Wakeup Possible in Java

Is Spurious Wakeup Possible in Java?

June 22, 2004

Spurious wakeup은 여러 개의 CPU를 가진 SMP 기계에서 동기화를 할 때 나타나는 예기치 못한 동기화 객체의 깨어남을 뜻하는 용어입니다. POSIX thread 프로그래밍을 할 때, pthread_cond_signal 함수에 대한 호출의 결과로 pthread_cond_wait를 하고 있던 몇 개의 쓰레드 중 반드시 하나의 쓰레드가 깨어난다는 보장이 없는 경우를 뜻합니다. 즉, 여러 개의 CPU가 있을 경우, 하나 이상의 쓰레드가 깨어날 가능성이 항상 존재한다는 뜻입니다.

자바에서는 사실 JLS(자바 언어 명세) 차원에서는 마치 spurious wakeup을 금지하는 듯한 느낌을 줍니다.

자바 언어 명세 17.14 Wait Sets and Notification [WWW] http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28471

하지만, JDK 1.5의 java.util.concurrent 패키지를 만든 Doug Lea는 실제 JVM 구현에서는 posix API를 그대로 사용하는 경우가 많고, 이때 spurious wakeup에 대한 처리는 프로그래머의 몫이 된다는 점을 이야기해왔습니다. 그리고 마침내 JDK 1.5 API 문서에 명시적으로 spurious wakeup에 대한 처리를 요구하게 되었습니다.

[WWW] http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#wait()

A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup. While this will rarely occur in practice, applications must guard against it by testing for the condition that should have caused the thread to be awakened, and continuing to wait if the condition is not satisfied. In other words, waits should always occur in loops, like this one:

synchronized (obj) {
  while ()
    obj.wait(timeout);
  ... // Perform action appropriate to condition
}

(For more information on this topic, see Section 3.2.3 in Doug Lea's "Concurrent Programming in Java (Second Edition)" (Addison-Wesley, 2000), or Item 50 in Joshua Bloch's "Effective Java Programming Language Guide" (Addison-Wesley, 2001).

아마도 JVM을 구현하는 데 불필요하게 오버헤드가 필요한 부분을 명시적으로 배제하고, 좀더 나은 효율을 보장하려는 정책적 전환이 아닌가 생각됩니다. multi CPU 환경과 만나는 일이 빈번한 요즘, spurious wakeup을 고려한 프로그래밍은 불필요하고 찾기 힘든 버그를 막을 수 있는 중요한 코딩 관습이라고 생각됩니다. 이것은 비록 아주 작지만 JDK 1.5에서 동기화 패키지와 더불어 쓰레드 관련된 중요한 변화 중 하나라고 생각됩니다.

Posted by Yoon Kyung Koo at June 22, 2004 02:33 PM

Comments

Was browsing through blogspot when I stumbled here

Posted by: Jennifer Connor at November 9, 2004 04:36 PM 

last edited 2005-11-30 20:13:56 by YoonKyungKoo