반응형
자바
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 . 나만 알아보겠구만...
반응형
'프로그래밍(~2017) > 자바' 카테고리의 다른 글
[JAVA] 이클립스에서 주석 이쁘게 달기 (자동완성기능 사용했을때 내용뜨기) (0) | 2011.12.05 |
---|---|
[자바] MD5 만드는 함수 (0) | 2011.11.11 |
[자바]사용자 기본 홈 디렉토리 경로 찾기 (0) | 2011.11.10 |
inner 내부 클래스가 존재하는 클래스에서 외부클래스를 나타내는 this와 내부클래스를 나타내는 this- 클래스.this (0) | 2011.10.14 |
[자바] 리플렉션(Reflection)에 대해서 (0) | 2011.08.18 |