13-34~36 wait(), notify()

oyeon·2021년 3월 19일
0

Java 개념

목록 보기
59/70

동기화의 단점

  • 데이터가 보호되지만, 한 번에 한 쓰레드만 임계영역에 들어갈 수 있어서 프로그램의 효율이 떨어진다.

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){ // 출금 메서드
    	// balance : 잔고, money : 출금액
    	while(balance < money){
            try{
                wait(); // 대기 : 락을 풀고 기다린다. 통지를 받으면 락을 재획득(ReEntrance)
            }catch(InterruptedException e) {}
        }
    	balance -= money;
    } // withdraw
    
    public synchronized void deposit(int money){ // 입금 메서드
        balance += money;
        notify(); // 통지 : 대기 중인 쓰레드 중 하나에게 알림.
    }
}
profile
Enjoy to study

0개의 댓글