Javaの並行プログラミングで参照されるモニターとは何ですか?
「すべてのオブジェクトがモニターに関連付けられている」と読んだとき、それはどういう意味ですか?
特別な物ですか?
Javaの並行プログラミングで参照されるモニターとは何ですか?
「すべてのオブジェクトがモニターに関連付けられている」と読んだとき、それはどういう意味ですか?
特別な物ですか?
回答:
モニターは、オブジェクトへの同時アクセスを制御するメカニズムです。
これにより、次のことが可能になります。
スレッド1:
public void a()
{
synchronized(someObject) {
// do something (1)
}
}
スレッド2:
public void b()
{
synchronized(someObject) {
// do something else (2)
}
}
これにより、スレッド1と2が同時に監視(同期)セクションにアクセスすることを防ぎます。1つが起動し、最初の1つが終了する前に、モニターは他のユーザーが領域にアクセスできないようにします。
それは特別なオブジェクトではありません。これは、クラス階層ルートに配置された同期メカニズムですjava.lang.Object
。
また、オブジェクトのモニターを使用して異なるスレッド間の通信を行うメソッドもwait
ありnotify
ます。
Class
オブジェクト、または静的メソッドの対応するオブジェクトにのみ存在します。同期されたmethod1()がすでにあり、method2()の同期を宣言した場合、新しいモニターは作成されず、実際には(同じオブジェクトで)どちらかのメソッドを呼び出すと、同じモニターがロックされます。これは多くの場合、新規参入者を見つけ出します。
モニターは、ロックと待機セットの両方を持つエンティティです。Javaでは、どれでもObject
モニターとして機能できます。
Javaでモニターがどのように機能するかの詳細な説明については、Javaでの並行プログラミングのモニター機構セクションを読むことをお勧めします(前述のリンクはGoogleブックのプレビューを表示し、そのセクションは読むことができます)。
Wakes up all threads that are waiting on this object's monitor.
notifyall()について言うとき、私が得るものは、オブジェクトが維持していることです(内部エンティティ/オブジェクトの助けを借りて)すべてのスレッドがロックを待っているもの、その内部エンティティ/オブジェクトはモニターと呼ばれますか?
Java言語とランタイムシステムは、モニターを使用したスレッド同期をサポートしています。
モニターは特定のデータ項目(条件変数)に関連付けられ、そのデータのロックとして機能します。スレッドが一部のデータ項目のモニターを保持している場合、他のスレッドはロックアウトされ、データを検査または変更できません。
http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#33308
オブジェクトへのアクセスを一度に1つずつ制御するメカニズム
モニターは、スレッドが相互排除と特定の条件がtrueになるのを待つ(ブロックする)機能の両方を可能にする同期構造です。
モニターには、条件が満たされたことを他のスレッドに通知するメカニズムもあります。これは、ロックと待機セットの両方を所有するエンティティです。Javaでは、任意のオブジェクトをモニターとして使用できます。
Java仮想マシンでは、すべてのオブジェクトとクラスがモニターに論理的に関連付けられています。モニターの相互排除機能を実装するために、ロック(ミューテックスとも呼ばれる)が各オブジェクトとクラスに関連付けられています。これはオペレーティングシステムの用語ではセマフォと呼ばれ、mutexはバイナリセマフォです。
http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/monitors.html
モニターはオブジェクトまたはデータメンバーに関連付けられています。これは、データメンバーまたはオブジェクトが入力されるときに取得され、同期ブロック(クリティカルセクション)であり、終了時に解放されます。