Producer - Consumer (생성자 - 소비자) 문제 in jAVA

  • 생성자 소비자 문제는 운영체제에서 프로세스 동기화를 설명 하는 모델이다
  • 동기화는 공유 자원에 대해서 충돌없이 사용하게끔 만드는 작업이다.
  • 자바의 쓰레드를 이용해서 이 문제를 발생시켜 보았다.
public class ProducerConsumer {
    static int count =0; // 공유변수

    public static void main(String[] args) throws Exception{

        Thread t1 = new Thread(new producer()); //생성자 쓰레드
        Thread t2 = new Thread(new consumer()); //소비자 쓰레드

        t1.start();
        t2.start();

        System.out.println(ProducerConsumer.count);
    }

    static class producer implements Runnable{

        @Override
        public void run() {
            for(int i=0; i<10000;i++) {
                count++; //공유변수를 1씩 증가
            }
        }

    }

    static class consumer implements Runnable{

        @Override
        public void run() {
            for(int i=0; i<10000;i++) {
                count++; //공유 변수를 1씩 감소
            }
        }

    }

}
  • 위와 같은 프로그램을 작동시킨다면 producer 쓰레드와 consumer쓰레드 각각 공유 변수 count를 대상으로 계산이 시작될 것이다.
  • 상식적으로 producer와 consumer에서 각각 10000번씩 반복문이 돌았으니 count는 0이 되어야 한다.

image-20210427220105618

  • 하지만 이처럼 터무니 없는 count값이 출력이 되는데 이것이 바로 데이터의 일관성이 깨진 경우이다.

  • 한 순간 count의 값이 동시에 변화하게 된 경우에 데이터의 수정이 제대로 이루어지지 않아 발생하게 된다.

  • 자바 프로그램을 짜다보면 이런식으로 Thread가 동시에 돌아가는 경우를 심심치 않게 찾아볼 수 있으니 항상 동기화를 염두에 둔 코드를 작성해야 한다.
  • 생성자 소비자 문제를 해결하기 위해 세마포어나 모니터기능을 사용하기도 하는데 이에 대해서는 추후에 포스팅 하겠다.

'CS > 운영체제' 카테고리의 다른 글

Process & Thread  (0) 2021.10.19
컴퓨터 시스템의 구조  (0) 2021.10.14
운영체제 개요  (0) 2021.10.13
[운영체제] 데드락(deadlock, 교착상태)  (0) 2021.05.19
[운영체제] 뮤텍스, 세마포어  (0) 2021.05.12

+ Recent posts