생산자는 소비자를 소비자는 생산자를 깨우도록 한다면 비효율적으로 실행되는 부분이 제거됩니다
방법은 매우 간단합니다 Condition을 각각 두개 생성하면 됩니다
Condition prodCond = lock.newCondition();
Condition consCond = lock.newCondition();
이렇게 둘로 나눠서 Condition을 관리하면 생산자는 소비자를 깨우도록
소비자는 생산자를 깨우도록 만들 수 있습니다
예를들어 생산자에서 signal.로 consCond에 있는 스레드만 깨우도록 한다면, 비효율을 막을 수 있습니다
반대인 상황도 동일하게 적용하면 됩니다!
Object.notify()는 대기중인 스레드 중 임의의 하나를 선택해서 깨웁니다
스레드가 꺠우는 순서는 정의되어있지 않습니다
Condition.signal()은 대기중인 스레드 중 하나를 꺠우고 일반적으로 FIFO 순서로 꺠웁니다
참고로 ReentrantLock을 가지고 있는 스레드가 호출해야합니다