-
wait(), notify()공부/Java 2024. 5. 14. 17:38
wait(), notify()
- 동기화의 효율을 높이기 위해 사용한다.
※ 동기화로 데이터를 보호하는 것은 좋지만 해당 락을 기다리느라 다른 효율이 떨어지기 때문
- Object 클래스에 정의되어 있으며, 동기화 블럭 내에서만 사용할 수 있다.
- wait() - 객체의 lock을 풀고 쓰레드를 해당 객체의 waiting pool에 넣는다.
- notify() - waiting pool에서 대기중인 쓰레드 중 하나(지정불가)를 깨운다.
- notifyAll() - waiting pool에서 대기중인 모든 쓰레드를 깨운다.
wait()으로 사용하려는 쓰레드의 lock을 풀어야지만 사용할 수 있다.
하려고 하는 동작을 수행한 후 notify()를 사용하면, 쓰레드가 다시 lock을 획득한다.
이러면 데이터는 보호되면서도 쓰레드가 병렬적으로 잘 작동하게 된다.
두 메서드를 적절하게 사용하면 속도나 효율 면에서 훨씬 좋다.
요리사와 손님을 생각하면 좋다.
요리사는 손님에게 요리를 모두 제공하면 대기(wait()) 하고, 음식을 추가하면 손님에게 통보(notify())한다.
손님은 음식이 없으면 대기(wait())하고, 음식을 다 먹고 나면 요리사에게 통보(notify())한다.
wait()과 notify()는 쓰레드를 깨울 때 랜덤된 쓰레드가 깨워지게 된다.
특정 쓰레드를 깨우고 싶다면 락과 컨디션을 사용해야 한다.
락과 컨디션은 추후 작성하겠다.
'공부 > Java' 카테고리의 다른 글
함수형 인터페이스 (0) 2024.05.17 람다식(Lambda Expression) (0) 2024.05.16 쓰레드의 동기화(synchronization) (0) 2024.05.13 join(), yield() (0) 2024.05.13 suspend(), resume(), stop() (0) 2024.05.12