조건 변수

wait 뒤 반드시 조건 재검토

조건 변수의 안전성은 락 반납과 대기 등록의 원자성, 그리고 깨어난 뒤 while 재검사까지 포함한 규칙에서 나온다.

점검

조건 검사

락을 잡은 상태에서 버퍼가 비었는지, 가득 찼는지 확인한다.

wait

락 반납과 수면

조건이 거짓이면 wait이 락 반납과 큐 등록을 끊기지 않게 수행한다.

notify

알림 수신

생산자나 소비자가 상태를 바꾼 뒤 대기자를 깨운다.

lock

락 재획득

깨어난 스레드는 곧바로 실행하지 않고 모니터 락을 다시 경쟁한다.

while

조건 재검사

다른 스레드가 먼저 자원을 가져갔거나 허위 각성이면 다시 기다린다.

lost wakeup 방지

락 반납과 큐 등록 사이에 signal이 끼어들 수 없게 한다.

spurious wakeup 방어

깨웠다는 사실이 조건 참을 보장하지 않으므로 while로 감싼다.

notifyAll 이후 경쟁

여러 스레드가 깨어나도 락은 하나씩만 얻으므로 조건을 다시 확인한다.