JAVA/Thread

Thread wait(), notify() 소개

반응형

문제점

하나의 쓰레드가 객체에  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 크리티컬 세션  (0) 2016.12.21
java thread pool 소개  (0) 2016.12.21
JAVA 스레드 스케줄링  (0) 2016.12.21