Frudy
6k
2019-03-22 10:34:35 작성 2019-03-22 12:05:51 수정됨
1
215

(SOLVED)쓰레드관련 궁금증이 있습니다.


약 3일간 쓰레드에 대해 풀리지 않는 궁금증이 있어서

1. 입문서 책 참고

2. 구글링

3. 테스트코드

한 결과 


결론내린 가설이 있는데, 이에대해 확인해주시면 감사하겠습니다.

구글링해도 의문이 안풀려서 가설까지 세워가며 연구했네요...


의문)

생산자 쓰래드가 notify()를 호출했는데

소비자쓰래드가 Runnable상태가 되지못하고 Block이나 Waiting상태를 유지하는 현상발견.


가설)

동기화메소드, 블록은 한번에 하나의 쓰레드만 접근할 수 있기 때문에,

생산자쓰래드가 notify()를 하여 소비자쓰래드를 Runnable로 만들어주더라도,

생산자쓰래드가 동기화 메소드, 블록을 빠져나가지않고 계속 실행하면,

소비자쓰래드는 동기화메소드, 블록으로 접근할 수 없어야 하므로

Block상태를 계속 유지하는 것 같습니다.


극단적인 상황의 테스트코드 가져왔습니다.


아주 간단한 공유객체입니다.


아무것도 없는 소비자쓰래드.java입니다.



그리고 생산자쓰래드입니다.


공유객체랑 서로 상대방의 객체를 전달해주고 실행해봤더니..!


생산자쓰래드가 먼저 시작하는 Case에서,

notify()를 했음에도 ConsumerThread는 Runnable로 바뀌지 않았어요.


?!


notify()가 Runnable로 만들 수 있음을 항상 보장하지않는건가? 싶어서

또 여러가지 삽질을 해봤으나.....


결론을 내렸습니다.


결론 : notify()는 Runnable상태로 무조건 만들 수 있다.


하지만... 공유객체는 한번에 하나의 쓰래드만 접근할 수 있으니까..

아무리 notify()해준다 해도 정작 먼저 접근했던 생산자쓰래드가 안빠져나오고 버티면

Runnable된 소비자쓰래드가 무슨수로 들어올 수 있겠어요, 다시 Block상태 되는거죠.


다른 테스트코드에 의해 100% 무조건 notify()는 Runnable로 만들 수 있다고

확신하게 되어 이러한 결론에 도달하였습니다.


결론과 가설이 맞나요?

0
  • 답변 1

  • 엡실론
    1k
    2019-03-22 11:30:22

    네 맞습니다.

    notify 로 깨어난 스레드는 동기화 영역으로 진입하려고 하는데, 생산자 스레드가 동기화 영역에서 빠져나가지 않고 있으니 계속 그걸 기다리는 상태가 됩니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.