mutual exclusion을 보장 한다
즉 여러 스레드가 객체로 동시에 객체로 접근하는 것을 막는다
조건에 따라 스레드가 대기 상태로 전환이 가능하다
- 한번에 하나의 스레드만 실행돼야 할 때
mutual exclusion을 보장이 가능 하기 때문에- 여러 스레드와 협업이 필요할 떄 사용한다
Mutex
뮤텍스는 임계영역에서 mutual exclusion 을 보장하는 장치이다
그래서 임계영역에 진입하려면 mutex lock을 취득해야 한다 여기서
뮤텍스 lock을 취득하지 못한 스레드는 큐에 들어간 후 대기 waiting 상태로 전환 한다
뮤텍스 lock을 쥔 스레드가 lock을 반환하면 락을 기다리며 큐에 대기 상태로 있던 스레드 중 하나가 실행한다
Condition variable
waiting queue를 가지고 있다 여기서 waiting queue는 조건이 충족되길 기다리는 스레드들이
대기 상태로 머무는 곳을 말한다주요 세가지 동작
wait: 스레드가 자기 자신을 condition variable의 waiting queue에 넣고 대기 상태로 전환
signal: waiting queue에서 대기중인 스레드 중 하나를 깨움
broadcast: waiting queue에서 대기중인 스레드 전부를 깨움
자바에서 모든 객체는 내부적으로 모니터를 가진다
모니터의 mutual exclusion 기능은 Synchronized 키워드로 사용한다
자바의 모니터는 Condition variable를 하나만 가진다
자바 모니터의 세가지 동작
wait == wait
notify == signal
notifyAll == broadcast
자바 모니터를 사용할 때 두 가지 이상의 condition variable이 필요하다면 따로 구현이 필요함