Javaのモニターとは何ですか?


129

Javaの並行プログラミングで参照されるモニターとは何ですか?

「すべてのオブジェクトがモニターに関連付けられている」と読んだとき、それはどういう意味ですか?

特別な物ですか?


11
+1これにより、JVMレベルでのモニターの実装方法がわかりました。新しいことを学びました
naikus

@naikus私はあなたから詳細を共有することを期待します:)
roottraveller

回答:


89

モニターは、オブジェクトへの同時アクセスを制御するメカニズムです。

これにより、次のことが可能になります。

スレッド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ます。


1
同期メソッドを作成するとき、そのオブジェクトのメソッドにロック(モニター)を定義していると言えるでしょうか。
xdevel2000 2010

28
えっと、そうではありません。各オブジェクトには、他に関係なく、自動的に関連付けられたモニター(mutex)があります。同期されたメソッドを宣言すると、ランタイムはそのメソッドの実行が始まる前にオブジェクトのモニターのロックを取得する必要があることを宣言します(制御が呼び出しコードに戻る前にロックを解放する必要があります)。
Andrzej Doyle

31
そして@Pablo-メソッドのモニターのようなものはありません。モニターは、ほとんどのメソッドの囲みインスタンスであるClassオブジェクト、または静的メソッドの対応するオブジェクトにのみ存在します。同期されたmethod1()がすでにあり、method2()の同期を宣言した場合、新しいモニターは作成されず、実際には(同じオブジェクトで)どちらかのメソッドを呼び出すと、同じモニターがロックされます。これは多くの場合、新規参入者を見つけ出します。
Andrzej Doyle

1
@Andrzej:つまり、すべてのオブジェクトには1つのモニターが関連付けられています。次に、多くの同期メソッドを使用できます。そのメソッドが呼び出されるたびに、スレッドは同期を行うモニターを取得します。
xdevel2000 2010

1
これを明確にする必要があります...スレッド1で同期ブロックを呼び出すために使用されるオブジェクトを別のスレッド(スレッド2)で再び使用して、通常のメソッド(同期されていない)を同時に呼び出すことができますか?

26

モニターは、ロック待機セットの両方を持つエンティティです。Javaでは、どれでもObjectモニターとして機能できます。

Javaでモニターがどのように機能するかの詳細な説明については、Javaでの並行プログラミングのモニター機構セクションを読むことをお勧めします(前述のリンクはGoogleブックのプレビューを表示し、そのセクションは読むことができます)。


「モニターはエンティティ..」と言ったように、モニターとは、ロックとウェイトセットを保持/追跡する内部オブジェクト/状態であることを意味しますか?そうでない場合、エンティティをここで詳しく説明していただけますか?基本的に、Java docがWakes up all threads that are waiting on this object's monitor. notifyall()について言うとき、私が得るものは、オブジェクトが維持していることです(内部エンティティ/オブジェクトの助けを借りて)すべてのスレッドがロックを待っているもの、その内部エンティティ/オブジェクトはモニターと呼ばれますか?
user3198603 2017

最も役立つ答え。@JRLに感謝します。
gravetii

私には、「このページのプレビューはありません」と書かれています。
opncow

9
  1. モニターは、Java言語に限定されない概念/メカニズムです。
  2. 「並行プログラミングでは、モニターは、複数のスレッドで安全に使用されることを目的としたオブジェクトまたはモジュールです。」;
  3. すべての読者が知っているように、Javaのすべてのオブジェクトはjava.lang.Objectのサブクラスです。Javaの人々は、Javaプログラマーがオブジェクトをモニターとして使用できるようにする機能と特性を持つようにjava.lang.Objectを作成しました。たとえば、すべてのオブジェクトには待機キュー、再入キュー、待機および通知メソッドがあり、それをモニターにしています。
  4. モニターについてはこちらをお読みください

4

Java言語とランタイムシステムは、モニターを使用したスレッド同期をサポートしています。
モニターは特定のデータ項目(条件変数)に関連付けられ、そのデータのロックとして機能します。スレッドが一部のデータ項目のモニターを保持している場合、他のスレッドはロックアウトされ、データを検査または変更できません。



2

モニターは、スレッドが相互排除と特定の条件がtrueになるのを待つ(ブロックする)機能の両方を可能にする同期構造です。

モニターには、条件が満たされたことを他のスレッドに通知するメカニズムもあります。これは、ロックと待機セットの両方を所有するエンティティです。Javaでは、任意のオブジェクトをモニターとして使用できます。

Java仮想マシンでは、すべてのオブジェクトとクラスがモニターに論理的に関連付けられています。モニターの相互排除機能を実装するために、ロック(ミューテックスとも呼ばれる)が各オブジェクトとクラスに関連付けられています。これはオペレーティングシステムの用語ではセマフォと呼ばれ、mutexはバイナリセマフォです。

詳細については、リンクを確認してください


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.