ホームページ >Java >&#&チュートリアル >モニターってどういう意味ですか? Java でのモニターの概要
この記事では、「モニター」の意味について説明します。 Java での Monitor の導入には一定の参考価値があります。必要な方は参考にしていただければ幸いです。
Monitor は英語で「モニター」と訳されることも多く、「モニター」と訳されるか「モニター」と訳されるかは、中国語の翻訳による曖昧な比較です。 、モニターの直感的な説明を実現することは不可能です。
この記事「オペレーティング システムの同期プリミティブ」では、プロセス/スレッド間の同期に直面する際にオペレーティング システムによってサポートされるいくつかの同期プリミティブを紹介します。その中で、セマフォ セマフォとミューテックス ミューテックスは最も重要な同期プリミティブです。
同時実行制御に基本的なミューテックスを使用する場合、プログラマはミューテックスのダウンおよびアップ操作の制御に細心の注意を払う必要があります。そうしないと、デッドロックやその他の問題が発生しやすくなります。正しい並行プログラムの作成を容易にするために、ミューテックスとセマフォに基づいた高レベルの同期プリミティブ モニターが提案されていますが、実際には、オペレーティング システム自体がモニター メカニズムをサポートしていないことに注意してください。モニターを使用したい場合は、まずその言語自体がモニター・プリミティブをサポートしているかどうかを調べます。例えば、C 言語はモニターをサポートしていませんが、Java 言語はモニターをサポートしています。
一般的なモニターの実装モードでは、プログラミング言語が構文内で構文糖を提供し、モニターのメカニズムを実装する方法は Java の仕事です。
モニターの重要な機能は、モニターで定義されたクリティカル セクションに同時に入ることができるプロセス/スレッドは 1 つだけであることです。これにより、モニターは相互排他を実現できます。ただし、相互排他を行うだけでは十分ではありません。モニターのクリティカル セクションに入ることができないプロセス/スレッドはブロックされ、必要に応じて起動される必要があります。明らかに、同期ツールとして、モニターはプロセス/スレッドのステータスを管理するためのそのようなメカニズムも提供する必要があります。セマフォとミューテックスがプログラミングにおいてエラーを起こしやすいと考える理由を考えてみましょう。変数を個人的に操作したり、プロセス/スレッドをブロックしたりウェイクアップしたりする必要があるからです。モニター機構が「上位プリミティブ」と呼ばれる理由は、モニターを使用する人がシンプルで使いやすいインターフェースを見るために、これらの機構を外部から遮断し、内部で実装する必要が必然的に必要になるためです。 。
監視メカニズムでは、いくつかの要素が連携する必要があります。つまり、次のとおりです。
重要なセクション
モニター オブジェクトとロック
モニター オブジェクトで定義された条件変数と待機およびシグナル操作。
監視メカニズムを使用する主な目的は、クリティカル セクションへの侵入を相互に排除することです。クリティカル セクションに侵入できないプロセス/スレッドをブロックするには、監視オブジェクトが必要です。このモニターは、ブロックされたスレッドを保存するためのリストなどの対応するデータ構造がオブジェクト内に存在します。同時に、モニターのメカニズムは基本的に基本的なミューテックスに基づいているため、モニター オブジェクトもミューテックスを維持する必要があります。ベースのロック。
さらに、適切な時間にプロセス/スレッドをブロックしてウェイクアップできるようにするには、この条件変数を使用して「適切な時間」がいつであるかを判断する必要があります。プログラム コードのロジックから取得することも、モニター オブジェクト内に配置することもできます。つまり、プログラマは条件変数の定義において大きな自主性を持っています。ただし、モニター オブジェクトは内部データ構造を使用してブロックされたキューを保存するため、スレッドがブロック状態に入り、後でウェイクアップできるようにする 2 つの外部 API、つまり待機と通知も提供する必要があります。
モニターはオペレーティング システムによって提案された高レベルのプリミティブですが、その特定の実装モードはプログラミング言語によって異なる場合があります。以下では、Java のモニターを例として、Java でモニターがどのように実装されるかを説明します。
Java では、以下に示すように、synchronized キーワードを使用してインスタンス メソッド、クラス メソッド、およびコード ブロックを変更できます。
/** * @author beanlam * @version 1.0 * @date 2018/9/12 */ public class Monitor { private Object ANOTHER_LOCK = new Object(); private synchronized void fun1() { } public static synchronized void fun2() { } public void fun3() { synchronized (this) { } } public void fun4() { synchronized (ANOTHER_LOCK) { } } }
は同期キーです。 Word で変更されたメソッドとコード ブロックは、監視メカニズムの重要なセクションです。
上記の synchronized キーワードを使用する場合、多くの場合、synchronized(this) や synchronized(ANOTHER_LOCK) (同期されている場合) など、それに関連付けるオブジェクトを指定する必要があることがわかります。変更されます。インスタンス メソッドの場合、その関連オブジェクトは実際には this です。クラス メソッドの場合、その関連オブジェクトは this.class です。つまり、synchronzied はオブジェクトに関連付ける必要があり、このオブジェクトがモニター オブジェクトです。
監視メカニズムでは、監視オブジェクトはミューテックスを維持し、スレッドのブロックとウェイクアップを管理する待機/シグナル API を定義する役割を果たします。
Java 言語の java.lang.Object クラスは、この要件を満たすオブジェクトです。任意の Java オブジェクトを監視機構の監視オブジェクトとして使用できます。
Java オブジェクトはメモリに格納され、オブジェクト ヘッダー、インスタンス データ、およびアライメント埋め込みの 3 つの部分に分かれており、そのオブジェクト ヘッダーにはロック識別子が同時に保存されます。 wait()、notify()、notifyAll() メソッドの場合、これらのメソッドの具体的な実装は、ObjectMonitor モードと呼ばれる実装に依存します。これは、C ベースの JVM 内に実装される一連のメカニズムです。基本原則は次のとおりです。
スレッドがオブジェクトのロックを取得する必要がある場合、スレッドがロックを取得すると、オブジェクトは EntrySet に配置されて待機します。現在のロックの所有者になります。プログラム ロジックに従って、ロックを取得したスレッドに何らかの外部条件が欠けており、続行できない場合 (たとえば、プロデューサーがキューがいっぱいであることを発見したり、コンシューマがキューが空であることに気づいた場合)、スレッドはロックを転送できます。 wait メソッドを呼び出してロックを解除し、ブロックして待機するように設定した待機状態に入ります。この時点で、他のスレッドがロックを取得して他の処理を実行できるため、以前に確立されていなかった外部条件が確立されます。以前にブロックされたスレッドが EntrySet に再度入ってロックを競合できること。この外部条件を監視機構では条件変数と呼びます。
synchronized キーワードは、Java が構文レベルで使用する重要なツールであり、開発者がマルチスレッド同期を簡単に実行できるようにします。同期メソッドによって変更されたメソッドまたはコード ブロックに入るには、まず、同期キーワードにバインドされたオブジェクトのオブジェクト ロックが取得されます。このロックにより、他のスレッドがこのロックに関連する他の同期コード領域に入ることが制限されます。
インターネット上の多くの記事や情報では、同期の原理を分析する際、基本的に同期は監視機構に基づいて実装されていると書かれていますが、それを明確にしている記事は少なく、漠然とした言及ばかりです。
前述の Monitor の基本要素を参照すると、synchronized が Monitor メカニズムに基づいて実装されている場合、対応する要素は何でしょうか?
クリティカル セクションが必要です。ここでのクリティカル セクションは、オブジェクト ヘッダー ミューテックスの P または V 操作と考えることができます。
これは、モニター オブジェクトに対応します。ミューテックス?つまり、実際の監視オブジェクトが見つかりません。
したがって、「同期は監視メカニズムに基づいて実装されている」という記述は不正確かつ曖昧だと思います。
Java が提供する監視機構は実際には Object などの要素が連携して形成されており、外部条件変数もコンポーネントとなります。 JVM の基礎となる ObjectMonitor は、モニター メカニズムの実装を支援するために使用される単なる共通モードですが、ほとんどの記事では、ObjectMonitor をモニター メカニズムとして直接扱っています。
これは次のように理解されるべきだと思います。Java のモニターのサポートは、メカニズムの粒度で開発者に提供されます。つまり、開発者は synchronized キーワードを Object の wait/notify などの要素と組み合わせて使用する必要があります。同氏は、生産者と消費者の問題を解決するために監視メカニズムを使用したと述べた。
以上がモニターってどういう意味ですか? Java でのモニターの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。