併発(十一):なぜ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条件判定に入り、条件述語が変化するのを避けて業務ロジックのエラーを処理し続けることである。