[CS/운영체제] 멀티스레드와 동시성 - 14부

황제연·2025년 7월 7일
0

CS학습

목록 보기
128/193
post-thumbnail

Lock Condition

생산자가 생산자를 깨우고, 소비자가 소비자를 깨우는 비효율적인 상황을 해결해야합니다

해결방안

해결의 핵심방안은 생산자 스레드는 데이터를 생성하고,
대기중인 소비자 스레드에게 알려주어야하고, 소비자 스레드는 데이터를 소비하고
대기중인 생산자 스레드에게 알려주면 됩니다

결국 생산자 스레드가 대기하는 대기집합과 소비자 스레드가 대기하는 대기집합을
둘로 나누면 됩니다

즉, 생산자 스레드가 데이터를 생산하면 소비자 스레드가 대기 집합에만 알려주고,
소비자 스레드가 데이터를 소비하면 생산자 스레드가 대기하는 대기 집합에만 알려주면 됩니다

이러한 대기집합을 불리하는 방법은 ReentrantLock을 사용하면 됩니다

Condition

Lock lock = new ReentrantLock() 으로 먼저 락을 선언하고
Condition condition = lock.newCondition(); 으로
ReentranceLock을 사용하는 스레드가 대기하는 스레드 대기공간을 만듭니다

condition.await()

Object.wait()과 유사한 기능으로 지정한 condition에 현재 스레드를 WAITING 상태로 보관합니다
이때 ReentrantLock에서 획득한 락을 반납하고 대기 상태로 condition에 보관합니다

condition.signal()

Object.notify()와 유사한 기능으로 지정한 condition에 대기중인 스레드를 하나 깨웁니다
깨어난 스레드는 condition에서 빠져나옵니다

이렇게 ReentrantLock 내부에 락과 락 획득을 대기하는 스레드를 관리하는 대기큐가 있습니다
ReentrantLock을 사용하면 conditino이 스레드 대기 공간입니다

아직은..

하지만 여기까지는 아직 스레드 대기공간인 condition을 분리하지 않았기 때문에 기존문제와 동일합니다
다음 15부에서는 각 대기공간을 분리해서 따로 만들어보겠습니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글