JAVA

태태개발일지 - java 고급 멀티스레드

태태코 2025. 3. 6. 11:08
반응형

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

가정:

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. 소비자를 깨워야하는 상황에 생성자만 깨우는 상황이 일어날 수 있다.

 

 

 

이 한계를 극복하는 방법은 다음 글로 작성하겠다.

 

 

 

 

 

 

 

반응형