PC問題でwaitはifを使っていますか?それともwhileを使っていますか?
801 ワード
PC問題でwaitはifを使っていますか?それともwhileを使っていますか?
シナリオ:マルチスレッドにおける生産者消費者問題において、臨界エリアリソースに対して待つプロセスがあり、
例えば:
まず、wait()メソッドを呼び出した後、現在のスレッドはモニタを取得するとロックが解除され、CPU時間が呼び覚まされると
シナリオ:マルチスレッドにおける生産者消費者問題において、臨界エリアリソースに対して待つプロセスがあり、
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()
の動作が可能となる.