동기화의 효율을 높이기 위해 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(); // 통지 - 대기중인 스레드 중 하나에게 알림
}
}
출금하고자 하는 돈이 계좌에 있는 돈보다 많으면 해당 스레드의 락을 풀고 스레드를 대기시킨다. 그리고 계좌에 돈이 입금되면 대기 중인 스레드 중 하나에게 알려주어 다시 돈을 인출할 수 있도록 깨운다.
'JAVA' 카테고리의 다른 글
[Thread] volatile (0) | 2023.02.28 |
---|---|
[Thread] 스레드의 동기화 - Lock과 Condition (0) | 2023.02.28 |
[Thread] 스레드의 동기화 - synchronized (0) | 2023.02.27 |
[Thread] join(), yield() (0) | 2023.02.27 |
[Thread] suspend(), resume(), stop() (0) | 2023.02.27 |