상호 배제(Mutual Exclusion)
를 보장한다.- 조건에 따라 스레드가
대기(Waiting)
상태로 전환하는 기능을 제공한다.
- 한 번의 하나의 스레드만 실행될 때 사용된다.
- 여러 스레드와
협업(Cooperation)
이 필요할 때 사용한다.
- Mutex
- Condition Variable
임계 영역(Critical Section)
에서상호 배제(Mutual Exclusion)
를 보장하는 장치임계 영역(Critical Section)
에 진입하려면,Mutex Lock
을 취득해야 한다.Mutex Lock
을 취득하지 못한 스레드는Queue
에 들어간 후,대기
상태로 전환된다.Mutex Lock
을 취득한 스레드가 작업을 끝내고Lock
을 반환하면,Queue
에대기
상태로 있던 스레드 중 하나가 실행된다.
Wating Queue
를 기본적으로 가진다.Wating Queue
는 조건이 충족되길 기다리는 스레드들이대기
상태로 머무는 곳이다.
- 스레드가 자기 자신을
Condition Variable
의Wating Queue
에 넣고,대기
상태로 전환한다.
Wating Queue
에서대기
중인 스레드 중에 하나를 깨우는 역할을 한다.
Wating Queue
에서대기
중인 스레드를 전부 깨우는 역할을 한다.
임계 영역(Critical Section)
에 진입을 기다리는 큐이며,Mutex
에서 관리하는Queue
이다.
- 조건이 충족되기를 기다리는
Queue
이며,Condition Variable
이 관리하는Queue
이다.
Producer
가 아이템을 계속 생산해서Buffer
가 가득차서 공간이 없는 상황이다.Buffer
가 비워지기를 기다리면서Producer
가 계속 확인하는 문제가 있다.
Consumer
가Buffer
에 아이템이 하나도 없는 상황이다.Consumer
는Buffer
에 아이템이 있는지 계속해서 확인해야 하는 문제가 있다.
Monitor
를 통해 해결할 수 있다.- 위 코드의
producer()
,consumer()
흐름을 정확히 이해할 것
Monitor
라는 것이 사실 프로그래밍 언어 레벨에서 지원되는 것이다.- 따라서
Monitor
를 직접 구현하는 일은 잘 없다. - 프로그래밍 언어에서 지원하는
Monitor
를 사용만 하면 되는 것이다.
- 자바에서 모든 객체는 내부적으로
Monitor
를 하나씩를 가지고 있다. - 자바
Monitor
의상호 배제(Mutual Exclusion)
기능은synchronized
키워드로 사용한다. - 자바
Monitor
는Condition Variable
를 하나만 갖는다.
Wait
Notify
(Signal
과 동일)NotifyAll
(BroadCast
와 동일)
synchronized
키워드를 통해상호 배제(Mutual Exclusion)
가 보장된다.wait()
,notifyAll()
메소드를 통해Condition Variable
의Wating Queue
로 스레드를 보내거나,Waiting Queue
에 있는 스레드를 깨운다.wait()
가 호출되면, 가지고 있던Lock
을 반납한다는 점을 꼭 기억해야한다.
- 자바
Monitor
를 사용할 때, 두 가지 이상의Condition Variable
이 필요하다면, 따로 구현이 필요하다. java.util.concurrent
패키지에는 동기화 기능이 탑재된 여러 클래스들이 있으니 참고해서 사용하면 된다.