「Java 언어로 배우는 디자인 패턴 (멀티 스레드 편)」정리 (그 6)



Balking 패턴



balk란, 그만두고 돌아가는 것. 야구의 보크도 balk. Balking 패턴에도 Guarded Suspension 패턴과 마찬가지로 가드 조건이 등장한다. Balking 패턴에서는 가드 조건이 충족되지 않으면 즉시 중단한다. 이것이 실행 가능한 상태가 될 때까지 기다리는 Guarded Suspension 패턴과의 차이.

에디터의 자동 저장 기능 같은 것을 생각한다. 현재의 데이터의 내용을 정기적으로 파일에 기입하는 처리를 하는 thread가 있다. 데이터 내용이 업데이트될 때만 저장합니다. 데이터의 내용에 차이가 있는 것을 가드 조건으로 하고, 차이가 없으면 파일에 기입하는 처리를 실시하지 않고 돌아간다(balk한다).

(코드 전체는 본서를 참조)
...
    public synchronized void change(String newContent) { 
        content = newContent; 
        changed = true; 
    } 

    public synchronized void save() throws IOException { 
        if (!changed) { // 変更されていなければ 
            return; // balkする
        } 
        doSave(); 
        changed = false; 
    }
...

등장인물



GuardedObject 역할은 가드된 메소드(guardedMethod)를 가지고 있는 클래스. 가드 조건이 충족되면 즉시 실행하고, 충족되지 않으면 실제 처리로 이동하지 않고 돌아갑니다. GuardedObjec 역할은 인스턴스의 상태를 변경하는 메서드(stateChangingMethod)를 가질 수 있다. 샘플 프로그램에서는 Data 클래스가 이 역할을 맡고, save 메소드가 guardedMethod, change 필드가 stateChangingMethod에 대응한다.

어떤 때 사용하는지


  • 굳이 처리할 필요가 없는 경우
  • 가드 조건이 충족되기를 기다리고 싶지 않은 경우
  • 가드 조건이 충족되는 것이 최초의 1회만이라고 하는 경우. 예를 들어 초기화하고 있는지 어떤지를 조사해, 초기화되어 있지 않은 경우에 한 번만 초기화하는 경우.
  • ...
        public synchronized void init() { 
            if (initialized) { 
                return; 
            } 
            doInit(); 
            initialized = true; 
        }
    

    initialized 필드와 같이, 「단 한 번만 상태가 변화하는 변수」를, 일반적으로 래치(latch: 래치)라고 부른다.

    타임아웃



    Balking 패턴과 Guarded Suspension 패턴의 중간으로서, 가드 조건을 만족할 때까지 일정 시간 기다리는 대처 방법이 있다. 가드 조건을 만족할 때까지 일정 시간이 지나고 아직 조건이 충족되지 않은 경우에는 balk라고 하는 처리를 guarded timed 혹은 timeout이라고 부른다.
        obj.wait(1000) // 1000ミリ秒待つ
    

    하지만 Java는 notify/notifyAll되었는지 타임아웃했는지를 구별할 방법이 없다.

    관련
    「Java 언어로 배우는 디자인 패턴 (멀티 스레드 편)」정리 (그 1)
    「Java 언어로 배우는 디자인 패턴 (멀티 스레드 편)」정리 (그 2)
    「Java 언어로 배우는 디자인 패턴 (멀티 스레드 편)」정리 (그 3)
    「Java 언어로 배우는 디자인 패턴 (멀티 스레드 편)」정리 (그 4)
    「Java 언어로 배우는 디자인 패턴 (멀티 스레드 편)」정리 (그 5)

    좋은 웹페이지 즐겨찾기