반응형
생산자 스레드와 소비자 스레드 시뮬레이션

가정:
1. 생산자는 데이터를 가져와서 queue에 입력을한다.
2. 소비자는 데이터를 queue에서 가져와서 제거한다.
기본 코드 예시
public synchronized void produce(int value) throws InterruptedException {
while (queue.size() == MAX_SIZE) {
System.out.println("Queue is full. Producer is waiting...");
sleep(); // Queue가 꽉 차면 기다림
}
queue.offer(value);
System.out.println("Produced: " + value);
notify(); // 소비자를 깨움
}
sleep 과 wait() notifiy()에 대한 내용이다.

sleep()의 문제점
위와같이 임계영역에서 sleep() 을 사용했을 경우에는 lock을 가지고 sleep 상태에 들어가기 때문에 다른 스레드들이 lock을 획득하지 못하고 무한정 기다리는 상황이 발생하게 된다.
해결방안
sleep을 사용하지 않고, wait()과 notifiy()를 사용한다.
생산자 입장: queue가 다차있다.
소비자 입장: queue가 비어있다.
임계영역에서 wait()상태로 들어간 후 lock을 반납한다.
그렇게되면 남아있는 소비자나 생성자가 깨어나서 lock을 획득한 후 다음 로직을 실행한다.
wait() , notifiy() 한계점
notifiy()는 어떤 스레드를 깨우는 지 알 수 없기때문에.
1. 계속 같은 스레드를 깨울 수 도있고,
2. 소비자를 깨워야하는 상황에 생성자만 깨우는 상황이 일어날 수 있다.
이 한계를 극복하는 방법은 다음 글로 작성하겠다.
반응형
'JAVA' 카테고리의 다른 글
태태개발일지 - 자바 고급 (김영한) CAS 연산 (1) | 2025.03.17 |
---|---|
태태개발일지 - java 고급 멀티스레드(김영한) (1) | 2025.03.08 |
태태개발일지 - 자바 고급 멀티쓰레드(김영한) (1) | 2025.02.22 |
태태개발일지 - 멀티스레딩(김영한 고급 자바) (1) | 2025.02.17 |
태태개발일지 - 고급 자바 멀티 스레드 (1) | 2025.02.11 |