쓰레드의 동기화 - wait() , notify(), notifyAll()
ppt )
class Acoount {
int balance = 1000;
public synchronized void withdraw(int money) { 1. 동기화가 된 상태로 실행중 (다른 쓰 레드가 침범을 못함 )
while(balance < money ) {
try {
wait () ; 2. wait 를 만나면 동기화가 된 락이 풀리게 되서 다른 쓰레드가 침범
다른 쓰레드가 notiry() 를 만나서 깨워줄때까지 일시정지 영역(Wait set)에 있다.
} catch ( InterruptedException e ) {} 4. notify 로부터 깨어나면 동기화락을 걸고 이 부분 나머지 실행을 한다.
}
balance -= money ;
} //withdraw
public synchronized void deposit ( int money ) { 3. 동기화된 다른 쓰레드가 실행
balance += money ;
notify () ; 3. wait() 를 꺠워주고 그 밑에 있는 문장을(자기가 하던일 ) 실행해준뒤에 wait() 로 넘어간다. 깨어난 쓰레드가 wait() 다음문장부터 실행을 한다. (다시 wait() 가 있는 쓰레드가 락됨 )
}
}
* 쓰레드가 여러개 작동하다가 wait () 가 여러개(여러개의 쓰레드들로부터 ) 일시정지영역에 있을때 notify () 가 어떤 wait() 를 깨울지 모름 아무거나 깨움 뭐를 깨울지 모름.
notifyAll () 은 전부 다 깨워주는데 깨워진 애들중에 누가 실행이 될지 모름 ( 실행이 아무나 1개가 되면 나머지는 다시 일시정지 영역에서 잠들어 있다.
-깨워줄 wait() 가 없으면 notify() 는 그냥 뒤에 문장을 계속 실행한다.
-동기화를 해주면 class 단위로 락을 걸어준다. 다른 클래스에는 접근이 가능하다.
-동기화를 해주면 -> synchronized 가 안걸린 메소드 또한 접근이 안된다.
-
동기화....
댓글
댓글 쓰기