관리 메뉴

HAMA 블로그

자바 쓰레드 테스트 본문

Java

자바 쓰레드 테스트

[하마] 이승현 (wowlsh93@gmail.com) 2015. 8. 18. 11:46


 1 번쓰레드가  synchronized  안으로 들어가면  2 번쓰레드는 synchronized 안으로 진입 불가.

 1 번쓰레드가 함수자체를 빠져나오면, 그때서야 2번 쓰레드는 함수 진입가능 

1 번쓰레드가  synchronized  안으로 들어가면  2 번쓰레드는 synchronized 안으로 진입 불가.

1 번쓰레드가 synchronized 를 빠져나오면, 그때서야 2번 쓰레드는 함수 진입가능 

1 번쓰레드가  synchronized  안으로 들어가면  2 번쓰레드는 synchronized 안으로 진입 불가.

1 번쓰레드가 5초후에 synchronized 를 빠져나오면, 그때서야 2번 쓰레드는 함수 진입가능 

          1 번쓰레드가 synchronized  안으로 들어가면 , 2번 쓰레드는 synchronized 에 대기하고있다가 

          1 번 쓰레드가 wait 에 진입하는 순간 , 2 번쓰레드는 synchronized 안으로 진입

          2 번 쓰레드도 wait 에 진입하고 ,

          1 번 쓰레드가 wait 에서 3초 대기후 빠져나오면서 synchronized 의 락을 다시 되찾고, 

          synchronized 의 락을 되돌려 주면서 종료

          2 번 쓰레드도 wait 에서 3초 대기후 빠져나옴. 



 1 번쓰레드가  1번째  synchronized  안으로 들어가고, 2번째 synchronized 안의 wait 에 진입해도

  2 번쓰레드는 synchronized 안으로 진입 불가.

  1 번쓰레드가 3초후 함수자체를 빠져나오면, 그때서야 2번 쓰레드는 함수 진입가능 



 1 번쓰레드가 synchronized  안으로 들어가면 , 2번 쓰레드는 synchronized 에 대기하고있다가 

 1 번 쓰레드가 wait 에 진입하는 순간 , 2 번쓰레드는 synchronized 안으로 진입

 2 번 쓰레드도 wait 에 진입하고 ,  두개의 쓰레드가 wait 하고 있을때 

 notify 가 호출되면 ??

 테스트에 의해서는 먼저 wait 된것이 먼저 빠져나왔는데, 문서에는 보장못한다고 한다. 

 주의할것은 notify() 하면 하나만 빠져나오지만, notifyAll() 하면 모두 빠져나온다.

 물론, 1번 , 2 번 쓰레드가 동시에 빠져나오는것은 아니며, 1번이 빠져나오면 synchronized 에 대한 

 락을 소유하기때문에, 2 번은 대기하다가, 1번이 락을 해제하면, 그때 2번이 락을 잡고 빠져나온다.

 

 따라서, 아래처럼  wait() 문 주위로 while 로 감싸주는 코드를 사용한다.(notifyAll 한번 호출에 하나씩 활동

 하기위해~notify 써도되긴 한다.근데 notify 를 쓰면 좀비쓰레드가 생길 가능성 up!!)


public synchronized void Func throws InterruptedException {       
while (!active) {
wait();
}
active = false;
}

하지만 위 처럼 하면, wait 에 2개의 쓰레드가 걸려있고, notifyAll() 가 2번 불려졌을때에도 
쓰레드중 하나만 빠져나올가능성이 있다.  (notifyAll 이 먼저 2번 호출되었을 경우) 

따라서 아래처럼 while 문의 조건을 list 로 둘수도있게된다.

public synchronized void Func() throws InterruptedException {
while (list.isEmpty()) {
wait(1000);
}
Integer i = list.pop();
}

public synchronized void Func2(int i ) {
notifyAll();
list.add(i);
}


Comments