Java Adv 11 - Thread Consumer, Producer
in Programming Language on Java
생산자 소비자 대기 공간 분리
생산자용 Condition과 소비자용 Condition을 나눠서 만든다.
lock.newCondition을 2번 호출해서 ReentrantLock을 사용하는 스레드 대기 공간을 2개 만들었다. 이렇게 관리하면 생산자 스레드, 소비자 스레드를 정확하게 나누어 관리하고 깨울 수 있다.
생산자가 데이터를 생산하면 생산자용 대기에서 기다리고, 데이터를 생산하면 소비자를 깨운다. 소비자는 소비자 대기소에서 기다리고, 소비자가 데이터를 소비하고 나면 생산자를 깨우게 된다.
signal을 호출해서 대기중인 소비자를 깨우는 것을 확인할 수 있다.
Object.notify() vs Condition.signal()Object.notify()
대기 중인 스레드 중 임의의 하나를 선택해서 깨운다. 스레드가 깨어나는 순서는 정의되어 있지 않으며, JVM 구현에 따라 다르다. 보통은 먼저 들어온 스레드가 먼저 수행되지만 구현에 따라 다를 수 있다. synchronized 블록 내에서 모니터 락을 가지고 있는 스레드가 호출해야 한다. Condition.signal() 대기 중인 스레드 중 하나를 깨우며, 일반적으로는 FIFO 순서로 깨운다. 이 부분은 자바 버전과 구현에 따 라 달라질 수 있지만, 보통 Condition 의 구현은 Queue 구조를 사용하기 때문에 FIFO 순서로 깨운다. ReentrantLock 을 가지고 있는 스레드가 호출해야 한다.
Reference
김영한님의 자바 강의
https://stackoverflow.com/questions/50001353/java-one-producer-and-two-consumers
https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html