wait(), notify()

김성수·2023년 6월 13일
0

Java

목록 보기
12/18

들어가면서

쓰레드의 wait과 notify에 대해 간략하게 정리해보려 한다.

wait()이란?

sync된 쓰레드를 wait()을 호출하여 Lock을 반납하고 waiting pool에 보관한다.

synchronized (객체) {
    while (조건이 충족되지 않음) {
        객체.wait();
    }
    // 조건이 충족되었을 때 실행되는 코드
}

notify()

waiting pool에 담겨있는 쓰레드들 중에서 임의의 쓰레드를 깨운다.

synchronized (객체) {
    // 조건을 충족시킨 후 대기 중인 스레드를 깨웁니다.
    객체.notify();
}

특징

두 메서드 모두 synchronized 메서드 내부에 선언되어야 한다. 만약 그렇지 않을 경우 IllegalMonitorStateException이 발생할 수 있다.

wait과 notify를 사용하면서 병목 현상, 교착 상태(데드락), race condition 등을 주의해야 한다.

쓰레드가 깨워졌을 때 주어진 조건을 만족하지 않는다면 계속해서 대기 상태에 빠질 수 있다.

예시로 상품과 고객을 들어보겠다.

상품은 총 5개까지 입고할 수 있고, 고객은 상품을 골라서 살 수 있다.

상품이 모두 입고되면 상품은 wait 상태에 빠진다. 고객 또한 원하는 상품이 존재하지 않는다면 wait 상태에 빠지게 된다.

두개의 쓰레드 모두 영원한 wait 상태에 빠지게 되어버린다.

이러한 문제를 해결하기 위해 Lock과 Condition을 사용할 수 있다.

profile
깊이 있는 소프트웨어 개발자가 되고 싶습니다.

0개의 댓글