Java/Thread
Thread의 notify와 wait 메소드
MKJo
2023. 7. 17. 17:39
notify() wait() 를 호출했다면 에 의해서 락을 반납하고 대기실에서 대기 중인 쓰레 드 중에서 하나를 임의로 선택해서 통지할 뿐 락을 반납한 해당 쓰레드를 선택해서 통지 할수 없다.
운 좋게 락을 반납한 해당 스레드가 통지를 받으면 다행인데 그렇지 않 으면 계속 통지를 받지 못하고 무한정 기다리게 되는 현상이 발생한다 이런 현상을 '기아 현상' 이라 한다.
이 현상을 방지하기 위해 notify() 대신 notifyAll() 을 사용 해야 한다. 이 메서드는 대기실에 대기중인 모든 쓰레드에게 통지를 하기 때문에 기아 현상은 막았지만 통지 받은 쓰레드가 서로 락을 얻기 위해 경쟁을 하게 된다.
이처럼 여러 쓰레드가 서로 락을 얻기 위해 경쟁하는 것을 '경쟁 상태' 라 한다. 이 경쟁 상태를 개선하기 위해서 각 쓰레드를 구분해서 통지하는 것이 필요하다. Lock과 컨디션을 이용하면 부분적인 선별적 통지가 가능하다.
컨디션을 사용하면 wait() 대신 await(), notify() 대신 signal() 을 이용한다.