2020.11.02 고급자바 수업노트 쓰레드의 동기화 wait() , notify(), notifyAll() 짧은 설명

 쓰레드의 동기화 - 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 가 안걸린 메소드 또한 접근이 안된다. 

동기화.... 



댓글