Javaの並行プログラミングで参照されるモニターとは何ですか?
「すべてのオブジェクトがモニターに関連付けられている」と読むと、どういう意味ですか?
それは特別なオブジェクトですか?
モニターは、オブジェクトへの同時アクセスを制御するメカニズムです。
これにより、次のことが可能になります。
スレッド1:
public void a()
{
synchronized(someObject) {
// do something (1)
}
}
スレッド2:
public void b()
{
synchronized(someObject) {
// do something else (2)
}
}
これにより、スレッド1と2が同時に監視(同期)セクションにアクセスすることを防ぎます。 1つが開始し、最初の1つが終了する前にもう1つが領域にアクセスするのをモニターが防止します。
特別なオブジェクトではありません。クラス階層ルートに配置された同期メカニズム:Java.lang.Object
。
また、異なるスレッド間の通信にオブジェクトのモニターを使用するwait
およびnotify
メソッドもあります。
モニターは、 lock と wait set の両方を持つエンティティです。 Javaでは、任意のObject
がモニターとして機能します。
Javaでモニターがどのように機能するかの詳細な説明については、 Javaでの並行プログラミング のMonitor Mechanicsセクションを読むことをお勧めします。 =(前のリンクはGoogleブックのプレビューを表示し、そのセクションは読むことができます)。
Java言語およびランタイムシステムは、モニターの使用によるスレッド同期をサポートします。
モニターは特定のデータ項目(条件変数)に関連付けられ、そのデータのロックとして機能します。スレッドがあるデータ項目のモニターを保持している場合、他のスレッドはロックアウトされ、データを検査または変更できません。
http://Java.Sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#33308
オブジェクトへのアクセスを1つずつ制御するメカニズム
モニターは、スレッドが相互排除と特定の条件が満たされるのを待機(ブロック)する機能の両方を持つことができる同期構造です。
モニターには、他のスレッドに条件が満たされたことを通知するメカニズムもあります。これは、ロックと待機セットの両方を所有するエンティティです。 Javaでは、任意のオブジェクトをモニターとして使用できます。
Java仮想マシンでは、すべてのオブジェクトとクラスは論理的にモニターに関連付けられます。モニターの相互排除機能を実装するには、ロック(mutexと呼ばれることもあります)が各オブジェクトとクラスに関連付けられますこれは、オペレーティングシステムの用語ではセマフォと呼ばれ、ミューテックスはバイナリセマフォです。
http://journals.ecs.soton.ac.uk/Java/tutorial/Java/threads/monitors.html
モニターは、オブジェクトまたはデータメンバーに関連付けられます。これは、データメンバーまたはオブジェクトが入力されたときに取得され、同期ブロック(クリティカルセクション)であり、終了時に解放されます。