2012-03-24 12 views
55

Javaスレッドに関する記事を読むときに、「現在のスレッドはこのオブジェクトのモニターの所有者です」という表現に気付くことがよくあります。私は意味を持っています:スレッドは、オブジェクトを操作する権利を取得します。しかし、なぜ私たちは "オブジェクトのロック"の代わりに "オブジェクトのモニタ"という言葉を使用するのか困惑していますか?オブジェクトモニターのJavaでの意味は何ですか?なぜこの言葉を使うのですか?

簡潔に言えば、私は「モニター」という言葉の意味を知らない。 質問は奇妙で簡単かもしれない。しかし誰もがそれを解決するのに役立つことを願っています。 3ks

+1

+1実際にあなたの質問に答える唯一の人物です:私たちは、ホアレが1974年に戻したものだから "モニター"と呼んでいます。 –

答えて

36

しかし、私はなぜ "オブジェクトのロック"の "オブジェクトのモニタ" instendを使用するのか困惑していますか?

この文脈で使用されている用語「モニタ」を説明するリンクについてはulmangtの回答を参照してください。

なぜ「ロック」ではなく「モニタ」という用語を使用するのですか?まあ厳密に言えば、これらの用語は異なることを意味します...特に、本来はそれらが使用されることを意図した方法でそれらを使用する場合です。

  • 「ロック」は、特定のロックプロパティを維持する取得および解放プリミティブを持つものです。例えば排他的使用またはシングルライター/マルチリーダー。

  • "モニタ"は、ある時点で特定のセクション(またはセクション)を1つのスレッドだけが実行できるようにするメカニズムです。これは、ロック(および条件が満たされた他のスレッドを待つか、スレッドに通知を送信する「条件変数」)を使用して実装できますが、単なるロック以上のものです。実際、Javaの場合、モニターが使用する実際のロックは直接アクセスできません。 (あなたはちょうどあなたがJavaのLockインスタンスを持つことができますように...それを取得するから、他のスレッドを防ぐために、「Object.lockを()」と言うことはできません。)要するに

、人は知識をひけらかすことをした場合"モニタ"は実際には、Javaが提供しているものを特定するための「ロック」よりも優れた用語です。しかし、実際には、両方の用語はほぼ同じ意味で使用されています。

+1

あなたに感謝します。 – jiafu

+0

私は別の質問があります。すべてのオブジェクトは、ヒープデータのhousekeerpフィールドに自己ロック情報を持っています。その用途は何ですか? – jiafu

+0

@ jiafu - これがJava言語の指定方法であるためです。しかし実際には、オブジェクトのロックが実際に使用されない限り、オーバーヘッドは通常1ワード未満です。 –

4

すべてのオブジェクトには、何らかの種類のMonitorが組み込まれており、一部のコードで使用されるのを待っています。実際には、ほとんどのオブジェクトはモニタとして使用されることはありません。したがって、モニタは使用するまで作成する必要はありません。この機能をプライベートモニターモニターフィールドを持つすべてのオブジェクトとして実装するのではなく、グローバルHashMapモニターを持つJVMとして実装すると考えてください。

可能な実装は次のとおりです。同期ブロックに入るたびに、JVMは同期オブジェクトをマップ(モニタ)でルックアップします。それが見つかると、それはモニターを使用するようになります。見つからない場合は、マップ専用のクリティカルセクションに入ります。前のチェックとクリティカルセクションの間に別のスレッドが作成している可能性があるため、オブジェクトを再度検索します。まだそこになければ、同期オブジェクトのモニタを作成し、クリティカルセクションを残します。

+0

3ks助けてください – jiafu

5

​​ブロックはobjectのブロックで、オブジェクトのロックを制御します。ここにある例

synchronized (object) { 
    while (<condition does not hold>) 
     object.wait(timeout); 
    ... // Perform action appropriate to condition 
} 
1

Java仮想マシンは、モニターを使用してマルチスレッドをサポートします。モニタは、スレッドを実行している間の相互排除(ここでは「ロック」がどこにあるのか)とスレッド間通信の手段としての調整(ここではオブジェクトの待機メソッドと通知メソッドが現れます)という2つの概念を通してこれを実現します。 「インサイドJVM」から次の部分は、この疑問がクリアされます読み取る

は、それは非常にうまくこっち説明されている(第20章、スレッドの同期) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

0

これを答えるために遅れているにもかかわらず質問、私はちょうどそれを便利に追加すると思った。
は、ここで追加のメソッドがコールされたインスタンスである「この」は、使用されている例では、非同期Javaメソッド

public void add(int value){ 
synchronized(this){ 
     this.count += value; 
    } 
} 

内部のJavaコードの同期ブロックです。 同期インスタンスメソッドは、それが属するオブジェクトをモニターオブジェクトとして使用します。
=>同じモニターオブジェクトで同期されたJavaコードブロック内で実行できるスレッドは1つだけです。

関連する問題