併発(十一):なぜwait()は循環中に置かなければならないのですか?

1473 ワード

マルチスレッドのプログラミング実践において、wait()の使用方法は以下の通りである。
synchronized (monitor) {
    //              
    while(!locked) {
        //      
        monitor.wait();
    }
    //           
}
なぜwhileで判断しなければならないのか、ifで判断しないのか?以下のとおりです
synchronized (monitor) {
    //              
    if(!locked) {
        //      
        monitor.wait();
    }
    //           
}
これは、if判定を採用すると、スレッドがwaitから呼び覚まされると、他の業務ロジックを処理するコードを直接実行することになるが、この場合は、もう一つの可能性があり、条件付き述語は、処理業務ロジックの条件を満たしていないため、エラーの結果となり、次のように再判断する必要があるからである。
synchronized (monitor) {
    //              
    if(!locked) {
        //      
        monitor.wait();
        if(locked) {
            //           
        } else {
            //     monitor.wait(); 
        }
    }
}
サイクルとは、上述した表記を簡略化し、起動したら再びwhile条件判定に入り、条件述語が変化するのを避けて業務ロジックのエラーを処理し続けることである。