Monitor(모니터)
모니터(Monitor)는 여러 스레드가 공유 자원에 안전하게 접근하고, 스레드 간의 실행 순서를 제어하기 위한 동기화 메커니즘이다.
Java의 모든 객체(Object
)는 내부에 자신과 연결된 모니터를 하나씩 가지고 있으며, 다음과 같은 두 가지 주요 기능을 제공한다.
상호 배제 (Mutual Exclusion): 한 번에 오직 하나의 스레드만 공유 자원에 접근하도록 보장
스레드 간 협력 (Thread Coordination): 특정 조건을 만족할 때까지 스레드를 대기시키거나, 조건이 충족되었을 때 대기 중인 스레드에게 알려주는 실행 순서 제어 기능을 제공
모니터의 핵심 구성 요소
모니터는 내부적으로 다음과 같은 요소들로 구성되어 동기화를 관리한다.
뮤텍스(Mutex)
상호 배제를 구현하기 위한 잠금(Lock) 메커니즘(
Mutex
= Mutual Exclusion)모니터는 고유한 락을 하나를 가짐
스레드가 임계 영역에 진입하기 위해서는 반드시 해당 객체 모니터의 락 획득 필요
락을 획득한 스레드만이 임계 영역을 실행할 수 있으며, 실행이 끝나면 락을 자동으로 반납
조건 변수(Condition Variable)
스레드 간의 실행 순서를 제어하기 위한 특별한 동기화 장치(특정 상태 값이 아닌, 개념적인 제어 장치)
조건 변수는 스레드가 특정 조건이 충족되기를 기다려야 할 때, 락을 임시로 반납하고 대기 상태로 전환을 가능하게 해줌
락을 획득한 스레드가 작업을 계속할 수 없는 특정 조건을 만나면, 조건 변수를 통해
wait()
를 호출이때 스레드는 락을 반납하고 대기 큐(Wait Queue)로 이동
이후 다른 스레드가 조건을 충족시킨 뒤
notify()
를 호출하면, 대기 중이던 스레드가 다시 락 획득 경쟁에 참여
엔트리 큐(Entry Queue)
모니터의 락을 획득하기 위해 대기하는 스레드들이 머무는 공간
특정 스레드가 이미 락을 점유하고 있을 때, 다른 스레드들이 임계 영역에 진입하려고 시도하면 이 큐에 추가되어
BLOCKED
상태로 대기락이 반납되면 JVM은 엔트리 큐에서 스레드 하나를 선택하여 락을 부여
대기 큐 (Wait Queue)
락을 획득했으나 조건 변수에 의해 대기 상태로 전환된 스레드들이 머무는 공간
스레드가
wait()
메서드를 호출하면, 획득했던 락을 반납하고 이 큐로 이동하여WAITING
상태로 대기다른 스레드가
notify()
를 호출해주기 전까지 대기notify()
호출 시 엔트리 큐로 이동하여 다시 락 획득 경쟁에 참여
모니터 동작 과정 시나리오
1
락 획득 시도
임계 영역 진입 시도 -> 락 획득 -> 임계영역 실행
진입 시도 -> 이미 점유 되어 엔트리 큐에서 대기
2
조건 대기 (wait
)
임계 영역 실행 중, 특정 조건 미충족 -> wait()
호출 -> 락 반납 -> 대기 큐 이동
계속 엔트리 큐에서 대기
3
락 재획득 및 조건 충족
계속 대기 큐에서 대기
락 획득 -> 임계영역 실행
4
알림(notify
)
계속 대기 큐에서 대기
임계 영역 실행 중 notify()
호출
5
실행 재개
notify
로 깨움 -> 엔트리 큐 이동 -> 다른 스레드와 경쟁하여 락 획득 -> wait()
를 호출했던 지점부터 실행 재개
작업 완료 후 락 반납
Last updated
Was this helpful?