프로그래밍(~2017)/자바

[자바] wait(), notify() , notifyall() 사용시 주의점 java.lang.IllegalMonitorStateException

단세포소년 2011. 11. 10. 20:55
반응형

자바
wait(), notify(), notifyall() 을 무한 쓰레드의 cpu 점유율을 줄이기 위해 사용하게 되었다.
근데 위 함수를 사용하는 곳에서 자꾸 java.lang.IllegalMonitorStateException  예외가 떴다.

알아보니 wait(), notify(), notifyall()을 사용하는 객체가 synchronized(){} 되어야 했다.

정리
wait(), notify(), notifyall() 사용하는 객체를 synchronized(){}  하여라..

만약 thread 라는 객체가 있고 이 객체의 wait(), notify(), notifyall() 을 호출하기 위해서는
synchronized(thread)
{
    thread.wait();
}
하라는 말이다..


synchronized() 내의 객체와 wait나 notify 함수를 호출하는 객체는 같아야한다..

synchronized(A)
{
    B.wait();
}
이거 안됨

synchronized(A)
{
    A.wait();
}
이거 됨


아 그리고 자꾸 wait() 에 대해서만 synchronized 블럭 사용하는데 notify() , notifyall() 함수도 synchronized 블럭내에 있어야한다.

혹자들은 이런 생각을 할수 있다. synchronized 에 같은 객체를 블럭시키면 wait()가 의미가 없는 것이냐고.. 그렇지 않다. wait() 함수는 자신을 호출시킨 객체의 synchronized를 푼다. 이해가셨을지 모르겟다...;;; 리눅스의 pthread_cond_wait()를 참조해라.. 같은 원리다.


ps . 나만 알아보겠구만...
반응형