web-dev-qa-db-ja.com

Javaでのオブジェクトのモニターの意味は何ですか?なぜこの言葉を使うのですか?

Javaスレッドに関する記事を読むと、「現在のスレッドはこのオブジェクトのモニターの所有者です」という表現に気付くことがよくあります。しかし、「オブジェクトのロック」の代わりに「オブジェクトのモニター」というフレーズを使用する理由に戸惑いますか?

簡単に言えば、Wordの「モニター」の意味がわかりません。質問は奇妙で単純かもしれません。しかし、私は誰でもそれを解決するのを手伝ってくれることを望みます。 3ks

77
jiafu

しかし、「オブジェクトのロック」の代わりにWordの「オブジェクトのモニター」を使用する理由に戸惑いますか。

このコンテキストで使用される用語「モニター」を説明するリンクについては、ulmangtの回答を参照してください。ご了承ください:

"モニターはPer Brinch HansenとC. A. R. Hoareによって発明され、最初にBrinch HansenのConcurrent Pascal言語で実装されました。"

(出典: Wikipedia

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

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

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

要するに、どちらかといえば、「モニター」は実際には「ロック」よりもJavaが提供するものを特徴付けるために。

47
Stephen C

モニターとは、マルチスレッド環境でメソッドを安全に使用できるオブジェクトの単なる用語です。

モニターに関するすばらしいウィキペディアの記事があります。

http://en.wikipedia.org/wiki/Monitor_(synchronization)

下にスクロールすると、 Javaについての明示的なセクション が表示されます。

21
ulmangt

synchronizedの周りのobjectブロックは、オブジェクトのロックを制御するモニターです。ここに例

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

この質問に答えるのは遅かったとしても、それが役に立つ場合にだけ追加すると思いました。
これはJava非同期のJavaメソッド内のコード

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

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

4
aman

からの引用Java Virtual Machine

Java仮想マシンのスレッドは、モニター領域の開始点に到着するとロックを要求します。Javaには、同期ステートメントと同期メソッドの2種類のモニター領域があります。

モニター

モニターは、一度に1つのスレッドのみが占有できる1つの特別な部屋を含む建物のようなものです。部屋には通常、いくつかのデータが含まれています。スレッドがこのルームに入室してから退室するまで、スレッドはルーム内のすべてのデータに排他的にアクセスできます。モニターの建物に入ることは、「モニターに入る」と呼ばれます。建物内の特別な部屋に入ることを「モニターの取得」と呼びます。部屋を占有することは「モニターを所有する」と呼ばれ、部屋を去ることは「モニターを解放する」と呼ばれます。建物全体を離れることは、「モニターの終了」と呼ばれます。

データのビットに関連付けられていることに加えて、モニターは1つ以上のコードのビットに関連付けられています。これは、本書ではモニター領域と呼ばれます。

前述のように、この言語は、プログラム内のモニター領域を識別するための2つの組み込み方法を提供します。同期ステートメントと同期メソッドです。同期の相互排除の側面を実装するこれら2つのメカニズムは、Java仮想マシンの命令セットによってサポートされています。

ロック

モニターの相互排除機能を実装するために、Java仮想マシンはロック(mutexと呼ばれることもあります)を各オブジェクトとクラスに関連付けます。ロックは、1つのスレッドのみが「所有いつでも。

1つのスレッドで同じオブジェクトを複数回ロックできます。オブジェクトごとに、Java仮想マシンはオブジェクトがロックされた回数のカウントを維持します。ロック解除されたオブジェクトのカウントはゼロです。スレッドが初めてロックを取得するとき、カウントは再び1にインクリメントされます。スレッドが同じオブジェクトのロックを取得するたびに、カウントは再びインクリメントされます。

3
Zane XY

Java仮想マシンは、マルチスレッドをサポートするためにモニターを使用します。モニターは、スレッドの実行中の相互排他(ここで「ロック」が登場する場所)とインター手段としての調整)の2つの概念によってこれを実現しますスレッド通信(オブジェクトの待機メソッドと通知メソッドが登場する場所です)。

「Inside JVM」から次の部分を読むと、この疑問が明確になります。ここで非常にうまく説明できますか(第20章、スレッドの同期)-

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

2
adityalad