JAVA

[Thread] wait(), notify()

ewok 2023. 2. 27. 16:27

동기화의 효율을 높이기 위해 wait(), notify()를 사용한다.

만일 계좌에 출금할 돈이 부족해서 한 스레드가 락을 보유한 채로 돈이 입금될 때까지 계속 기다린다면 다른 스레드들은 모두 해당 객체의 락이 풀리는 것을 기다리느라 다른 작업들도 원활히 진행되지 않는다.

이 경우 wait()과 notify()를 사용하여 효율을 높일 수 있다.

 

Object 클래스에 정의되어 있으며, 동기화 블록 내에서만 사용할 수 있다.

 

  • wait() : 객체의 lock을 풀고 스레드를 해당 객체의 waiting pool에 넣는다.
  • notify() : waiting pool에서 대기 중인 스레드 중의 하나를 깨운다.
  • notifyAll() : waiting pool에서 대기 중인 모든 스레드를 깨운다.
class Account {
    int balance = 1000;
    
    public synchronized void withdraw(int money) {
        while (balance < money) {
            try {
                wait(); // 대기 - 락을 풀고 기다린다. 통지를 받으면 락을 재획득(ReEntrance)
            } catch (InterruptedException e) {}
        }
        balance -= money;
    } // withdraw
    
    public synchronized void deposit(int money) {
        balance += money;
        notify();   // 통지 - 대기중인 스레드 중 하나에게 알림
    }
}

출금하고자 하는 돈이 계좌에 있는 돈보다 많으면 해당 스레드의 락을 풀고 스레드를 대기시킨다. 그리고 계좌에 돈이 입금되면 대기 중인 스레드 중 하나에게 알려주어 다시 돈을 인출할 수 있도록 깨운다.