프로그래밍(~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 . 나만 알아보겠구만...
반응형