동기화의 단점
- 데이터가 보호되지만, 한 번에 한 쓰레드만 임계영역에 들어갈 수 있어서 프로그램의 효율이 떨어진다.
wait(), notify()
- 동기화의 효율을 높이기 위해 wait(), notify() 사용
- Object 클래스에 정의되어 있으며, 동기화 블록 내에서만 사용할 수 있다.
wait()
- 객체의 lock을 풀고, 쓰레드를 해당 객체의 waiting pool에 넣는다.
notify()
- waiting pool에서 대기 중인 쓰레드 중의 하나를 깨운다.
notifyAll()
- waiting pool에서 대기 중인 모든 쓰레드를 깨운다.
- notify()의 경우 특정 쓰레드가 계속 깨어나지 못할 수 있다. 이런 불공평을 없애기 위해 notifyAll()로 모든 쓰레드를 깨운다.(일반적으로 더 좋음)
class Account{
int balance = 1000;
public synchronized void withdraw(int money){
while(balance < money){
try{
wait();
}catch(InterruptedException e) {}
}
balance -= money;
}
public synchronized void deposit(int money){
balance += money;
notify();
}
}