Clean Code that Works.

다른 용어 로는 Spin Lock, Guarded wait

복수의 쓰레드가 인스턴스를 공유하고 있고 마음대로 인스턴스에 액세스 하게 되면 인스턴스의 안정성을 잃어 버리게 된다. 이를 해결 하기 위해서 인스턴스의 상태가 부적절한때에는 적절한 상태가 되기까지 쓰레드를 기다리게 한다. 인스턴스의 '적절한 상태'를 '가드 조건'으로 표현하고 안정성을 잃어버릴 위험이 있는 처리를 하기 전에 가드 조건이 충족되어 있는지를 테스트 한다. 가드 조건이 충족되어 있지 않으면 만족될 때까지 쓰레드를 기다리게 한다.

ps. Guarded Suspension 패턴을 사용하면 가드 조건에 의해 메소드의 실행을 제어할 수가 있다. 하지만 가드 조건이 영원히 충족되지 않으면 쓰레드는 영원히 기다리게 되므로 생존성을 잃어 버리게 될 수 있다.

ps. 자바에서는 가드 조건 테스트에 while문을 사용해서 기다리기 위한 wait 메서드를 사용한다. 가드 조건이 변화 했을 경우 notify/notifyAll 메서드를 사용해서 쓰레드를 깨우면 된다.

ex.

import java.util.LinkedList;

public class RequestQueue {
   private final LinkedList queue = new LinkedList();
   public synchronized Request getRequest() {
    while (queue.size() <= 0 ){
     try {
      wait();
     } catch (InterruptedException e) {
      // TODO: handle exception
     }
    }
    return (Request)queue.removeFirst();
   }
   public synchronized void putRequest(Request request){
    queue.addLast(request);
    notifyAll();
 }
}