본문 바로가기

CS/운영체제

Monitor(모니터) 개념과 자바 예제

Monitor

개요

오늘은 Monitor(모니터)에 대해 알아보고자 한다. Monitor(모니터)는 동기화를 위한 고수준 추상화 도구이다.

앞서 살펴본 SpinLock, Mutex, Semaphore는 프로그래머가 직접 락(lock)과 해제(unlock)을 신경 써야 했지만,

 

스핀락(spinlock) 뮤텍스(mutex) 세마포(semaphore) 각각 특징과 차이

개요동기화를 위한 여러 전략과 각각의 특징과 차이에 대해 알아보려고 한다.본격적으로 살펴보기 전에 알아두어야 할 개념이 있다.racecondition(경쟁조건)여러 프로세스/스레드가 동시에 같은 데

kimmangtae.tistory.com

 

모니터는 이 과정을 자동으로 관리해준다.

 

쉽게 말하면, 락(lock) + 조건 변수(condition variable)를 묶어둔 구조다.


특징

모니터 내부의 메서드는 자동으로 mutual exclusion (스레드가 동시에 들어오려고 해도, 모니터가 알아서 한 번에 하나만 들어가도록 막아준다)이 보장된다. 

 

락(lock)을 직접 획득/해제할 필요가 없고 wait() / notify() / notifyAll() 같은 메서드로 조건 동기화를 지원한다.

버퍼가 비었을 때 기다리거나, 버퍼가 채워지면 깨워주는 식의 제어가 가능하다.


자바에서의 모니터

자바에서 synchronized 키워드가 바로 모니터의 구현이다.

 

class SharedBuffer {
    private int data;
    private boolean hasData = false;

    public synchronized void produce(int value) throws InterruptedException {
        while (hasData) {
            wait(); // 이미 데이터가 있으면 소비될 때까지 대기
        }
        data = value;
        hasData = true;
        System.out.println("생산: " + value);
        notify(); // 소비자 깨우기
    }

    public synchronized int consume() throws InterruptedException {
        while (!hasData) {
            wait(); // 데이터가 없으면 생산될 때까지 대기
        }
        hasData = false;
        System.out.println("소비: " + data);
        notify(); // 생산자 깨우기
        return data;
    }
}

 

모니터를 활용하면 생산자–소비자 문제를 간단히 해결할 수 있다.

  • 생산자(Producer)는 버퍼에 데이터를 넣고, 가득 차 있으면 기다린다.
  • 소비자(Consumer)는 버퍼에서 데이터를 꺼내고, 비어 있으면 기다린다.
  • 이 모든 과정에서 synchronized, wait(), notify()로 락과 조건 동기화를 자동 처리한다.

정리

  • SpinLock / Mutex / Semaphore → 저수준 제어 (프로그래머가 직접 lock/unlock 관리)
  • Monitor → 고수준 추상화 (자동으로 mutual exclusion + 조건 동기화 제공)

 

 

결국 SpinLock, Mutex, Semaphore는 모두 “락을 직접 관리해야 하는 동기화 방식”이고,
모니터는 이걸 한 단계 추상화해서 자동 mutual exclusion과 조건 동기화를 제공한다.

 

즉, 프로그래머는 락 관리에 신경 쓰지 않고 로직에만 집중할 수 있게 된다.