-2

基本的な疑問があります。同期ブロック内で待機が呼び出されますが、同期によってロックされたブロックにアクセスしているスレッドが2つある場合、一方のスレッドがすでに同期になっていると、もう一方のスレッドはブロックに入ることができないと思いましたか?しかし、それが実行され、wait()が実行されると、他のスレッドがクリティカルセクションに入ることがわかります。したがって、クリティカルセクション内に2つのスレッドがあり、1つのスレッドとしてwait()呼び出しで待機しています。これは本当にそれが機能する方法ですか?ここ数年、同期されたブロック内には一度に1つのスレッドしか存在できないと思っていました。

私がそれを理解するのを手伝ってください..........あなたの助け。私はさまざまなリンクを見てきました、あなたの個人的な言葉は私にそれがほんの一段落で働いていることを説明しています、私にはたくさんあります。

ありがとうございました

4

2 に答える 2

1

wait()を呼び出すと、実行中のスレッドが一時停止され、同期によって保持されていたロックが解放されます。notify()またはnotifyAll()の呼び出しによってwait()が終了すると、wait()から戻る前にロックが再取得されます。

于 2012-05-27T21:15:58.890 に答える
1

オブジェクトでがwait呼び出されると、オブジェクトのロックが自動的に解放され、他のスレッドが進行できるようになります。例えば:

synchronized(obj) {
    obj.wait();
}

スレッドがロックオンを取得してobjから呼び出すとobj.wait()、スレッドは一時停止され、オブジェクトのロックが解除されて、たとえばobj別のスレッドが呼び出すことができるようになります。obj.notify()

javadocはそれをかなり明確に言っています:

現在のスレッドは、このオブジェクトのモニターを所有している必要があります。スレッドはこのモニターの所有権を解放し、notifyメソッドまたはnotifyAllメソッドのいずれかを呼び出して、このオブジェクトのモニターで待機しているスレッドにウェイクアップするように別のスレッドが通知するまで待機します。次に、スレッドはモニターの所有権を再取得できるようになるまで待機し、実行を再開します。

于 2012-05-27T21:16:08.000 に答える