문제점

하나의 쓰레드가 객체에  lock 을 걸고 어떤 조건이 만족될 때까지 기다려야 하는 경우, 이 쓰레드를 그대로 놔두면 이 객체를 사용하려는 다른 쓰레드들은  lock이 풀릴 때 까지 같이 기다려야 하는 상황이 발생

 

해결책

 이런 비효율을 개선하기 위해서 wait()와  notify()를 사용한다. 한 쓰레드가 객체에 lock을 걸고 오래 기다리는 대신 wait()을 호출해서 다른 쓰레드에게 제어권을 넘겨주고 대기상태로 기다리다가 다른 쓰레드에 의해서 notify() 가 호출 되면 다시 실행 상태가 되도록 하는 것이다.



wait(), notify(), notifyAll()

- object 클래스에 정의된 메소드이므로 모든 객체에서 호출이 가능하다.

- 동기화 블록(synchronized블록) 내에서만 사용이 가능 하다.

- 보다 효율적인 동기화를 가능하게 한다.

- 쓰레드가 wait()을 호출하면 그 때 까지 자신이 객체에 걸어 놓았던 모든 lock을 풀고, wait()이 호출된 객체의 대기실에서 기다린다. 그러다가 다른 쓰래드에 의해서  그 객체에 대한 notify()를 호출하면 객체의  대기실에서 벗어나서 다시 실행대기상태가 된다. 




예제

class Account {


int balance = 10000;


public synchronized void withdraw(int money){

while(balance<money){

try{

wait();

}catch(InterruptedExcepion e){}

}


//출금을 위해 withdraw()가 호출 되었을 때 잔고가 부족하면 wait()을 호춣해서 쓰레드가 객체의 lock을 풀고 그 객체의 waiting pool(대기실)에 들어가면서 제어권을 다른 쓰레드레게 양보하게 된다.


public syschronized void deposit(int money){

balance += money;

notify();

}

}



// 다른 쓰레드에 의해서 deposit()메소드가 호출되어 잔고가 증가하면서 notify()를 호출하면 객체의 waiting pool에서 기다리고 있던 쓰레드를 깨우게 된다.


}

'JAVA > Thread' 카테고리의 다른 글

JAVA 데몬 스레드 소개  (0) 2016.12.21
synchronized 쓰레드 예제 프로그래밍  (0) 2016.12.21
Thread wait(), notify() 소개  (0) 2016.12.21
Thread 크리티컬 세션  (0) 2016.12.21
java thread pool 소개  (0) 2016.12.21
JAVA 스레드 스케줄링  (0) 2016.12.21

+ Recent posts