Monitor(모니터)

모니터(Monitor)는 여러 스레드가 공유 자원에 안전하게 접근하고, 스레드 간의 실행 순서를 제어하기 위한 동기화 메커니즘이다. Java의 모든 객체(Object)는 내부에 자신과 연결된 모니터를 하나씩 가지고 있으며, 다음과 같은 두 가지 주요 기능을 제공한다.

  1. 상호 배제 (Mutual Exclusion): 한 번에 오직 하나의 스레드만 공유 자원에 접근하도록 보장

  2. 스레드 간 협력 (Thread Coordination): 특정 조건을 만족할 때까지 스레드를 대기시키거나, 조건이 충족되었을 때 대기 중인 스레드에게 알려주는 실행 순서 제어 기능을 제공

모니터의 핵심 구성 요소

모니터는 내부적으로 다음과 같은 요소들로 구성되어 동기화를 관리한다.

뮤텍스(Mutex)

  • 상호 배제를 구현하기 위한 잠금(Lock) 메커니즘(Mutex = Mutual Exclusion)

  • 모니터는 고유한 락을 하나를 가짐

  • 스레드가 임계 영역에 진입하기 위해서는 반드시 해당 객체 모니터의 락 획득 필요

  • 락을 획득한 스레드만이 임계 영역을 실행할 수 있으며, 실행이 끝나면 락을 자동으로 반납

조건 변수(Condition Variable)

  • 스레드 간의 실행 순서를 제어하기 위한 특별한 동기화 장치(특정 상태 값이 아닌, 개념적인 제어 장치)

  • 조건 변수는 스레드가 특정 조건이 충족되기를 기다려야 할 때, 락을 임시로 반납하고 대기 상태로 전환을 가능하게 해줌

    • 락을 획득한 스레드가 작업을 계속할 수 없는 특정 조건을 만나면, 조건 변수를 통해 wait()를 호출

    • 이때 스레드는 락을 반납하고 대기 큐(Wait Queue)로 이동

    • 이후 다른 스레드가 조건을 충족시킨 뒤 notify()를 호출하면, 대기 중이던 스레드가 다시 락 획득 경쟁에 참여

엔트리 큐(Entry Queue)

  • 모니터의 락을 획득하기 위해 대기하는 스레드들이 머무는 공간

  • 특정 스레드가 이미 락을 점유하고 있을 때, 다른 스레드들이 임계 영역에 진입하려고 시도하면 이 큐에 추가되어 BLOCKED 상태로 대기

  • 락이 반납되면 JVM은 엔트리 큐에서 스레드 하나를 선택하여 락을 부여

대기 큐 (Wait Queue)

  • 락을 획득했으나 조건 변수에 의해 대기 상태로 전환된 스레드들이 머무는 공간

  • 스레드가 wait() 메서드를 호출하면, 획득했던 락을 반납하고 이 큐로 이동하여 WAITING 상태로 대기

  • 다른 스레드가 notify()를 호출해주기 전까지 대기

  • notify() 호출 시 엔트리 큐로 이동하여 다시 락 획득 경쟁에 참여

모니터 동작 과정 시나리오

단계
이벤트/호출
Thread-1 상태/위치
Thread-2 상태/위치

1

락 획득 시도

임계 영역 진입 시도 -> 락 획득 -> 임계영역 실행

진입 시도 -> 이미 점유 되어 엔트리 큐에서 대기

2

조건 대기 (wait)

임계 영역 실행 중, 특정 조건 미충족 -> wait() 호출 -> 락 반납 -> 대기 큐 이동

계속 엔트리 큐에서 대기

3

락 재획득 및 조건 충족

계속 대기 큐에서 대기

락 획득 -> 임계영역 실행

4

알림(notify)

계속 대기 큐에서 대기

임계 영역 실행 중 notify() 호출

5

실행 재개

notify로 깨움 -> 엔트리 큐 이동 -> 다른 스레드와 경쟁하여 락 획득 -> wait()를 호출했던 지점부터 실행 재개

작업 완료 후 락 반납

Last updated

Was this helpful?