2017-12-14 1 views
1

私はマルチスレッドをより深く調査し始めました。なぜなら、待機/通知メカニズムを使用すると、同期化キーワードを追加する必要があるのは分かりません。 誰かが少し説明できますか?私は待機通知にmutexを必要とする理由

答えて

1

たとえば、あるスレッドがバッファからデータを読み取り、1つのスレッドがバッファにデータを書き込む場合。読み込みデータスレッドは、書き込みデータスレッドがブロックデータをバッファに完全に書き込むまで待機する必要があります。配線中のデータスレッドは、読み出しデータスレッドがバッファからデータを完全に読み出すまで待つ必要があります。 wait()メソッドとnotify()メソッドが通常のメソッドで呼び出せる場合、読み込みスレッドはwait()を呼び出し、そのスレッドは待ち行列に追加されます。同じ瞬間に、スレッドはnotify()を呼び出して条件の変更を通知します。読書スレッドは変更を逃し、永遠に待っています。競合状態のために、我々は潜在的に通知を失い、バッファを使用するか、ただ1つのスレッドが永遠に待っていて、プログラムがハングします。 Javaのwait()メソッドも待機する前にロックを解放し、wait()メソッドから戻る前にロックを再取得するので、このロックを使用して条件のチェック(バッファがいっぱいかどうか)を確認し、条件(バッファからの要素を取る)は、Javaで同期メソッドまたはブロックを使用することによって達成できるアトミックです。したがって、それらは相互に排他的な(mutex)同期メソッドまたはブロック内で呼び出される必要があります。

+0

お返事ありがとうございます。待っているキューは何ですか?たとえば、複数のスレッドが同じオブジェクト上で待機を呼び出す場合、ロックを解放する順序はありませんか? – asdasdsdf

+0

少なくとも次のようなソースを指している記事を引用している場合:http://www.xyzws.com/javafaq/why-wait- notify-not-all-called-a-synchronized-method-block/127 – Pshemo

関連する問題