PC問題でwaitはifを使っていますか?それともwhileを使っていますか?

801 ワード

PC問題でwaitはifを使っていますか?それともwhileを使っていますか?
シナリオ:マルチスレッドにおける生産者消費者問題において、臨界エリアリソースに対して待つプロセスがあり、wait()方法を呼び出して、他のスレッドのロック解除を待つプロセスがあります.
例えば:
while (queue.peek() == null) {
    wait();
}
queue.remove();

//     if
if (queue.peek() == null) {
    wait();
}
queue.remove();
具体的な原因:
まず、wait()メソッドを呼び出した後、現在のスレッドはモニタを取得するとロックが解除され、CPU時間が呼び覚まされるとwait()メソッドから実行される.if修飾を使用すると、スレッド数が2より大きい場合、ここでifコードブロックが出てきます.このとき、queueのsizeが1に等しい場合、異常を投げます.while修飾を使用する場合、waitの下から実行を継続し、whileの条件を実行し、さらにqueueの中でsizeが1より大きいと保証された場合には、queue.remove()の動作が可能となる.