同期キーワードメソッドを使用して、javapコマンドを使用してバイトコードを表示すると、モニターが使用されていることがわかります。同期が実装されているときにモニターを呼び出すことが可能であれば、私の理解は正しいですかそうでない場合は修正してください。それらの間の関係は何ですか?ロックとモニターの関係は何ですか?
ロックと同期( https://docs.Oracle.com/javase/tutorial/essential/concurrency/locksync.html )の公式ドキュメントから:
- 同期はintrinsic lockまたはmonitor lockと呼ばれる内部エンティティを中心に構築されます。
- すべてのオブジェクトには、固有のロックが関連付けられています。慣例により、スレッドはオブジェクトにアクセスする前にオブジェクトのmonitor lockを取得し、それが完了したらmonitor lockを解放する必要があります。スレッドは、ロックを取得してからロックを解放するまでの間に、ロックを所有していると言います。スレッドが監視ロックを所有している限り、他のスレッドは同じロックを取得できません。他のスレッドは、ロックを取得しようとするとブロックされます。
- スレッドがロックを解放すると、そのアクションとその後の同じロックの取得との間に発生前の関係が確立されます。
そのため、モニターとロックの違いを比較することはできず、相互に補完し合うことができます。 Java内のすべてのオブジェクトは、スレッドが可能なモニターに関連付けられていますlockまたはnlock。
このドキュメント では、質問への回答を見つけることができます。
同期。 Javaプログラミング言語は、スレッド間で通信するための複数のメカニズムを提供します。これらのメソッドの最も基本的なものは同期です。これは、monitorsを使用して実装されます。 Javaの各オブジェクトは、スレッドに関連付けられたモニターに関連付けられていますロックまたはロック解除できます。
ロック
ロックは、論理的にはヒープメモリ上のオブジェクトのヘッダーの一部である一種のデータです。 JVMの各オブジェクトにはこのロック(またはミューテックス)があり、プログラムはオブジェクトへのマルチスレッドアクセスを調整するために使用できます。スレッドがそのオブジェクトのインスタンス変数にアクセスする場合。次に、スレッドはオブジェクトのロックを「所有」する必要があります(ロックメモリ領域にフラグを設定します)。オブジェクトの変数にアクセスしようとする他のすべてのスレッドは、所有するスレッドがオブジェクトのロックを解放する(フラグを解除する)まで待機する必要があります。
スレッドがロックを所有すると、同じロックを複数回要求できますが、他のスレッドで使用できるようになるまで、同じ回数だけロックを解放する必要があります。たとえば、スレッドがロックを3回要求した場合、そのスレッドは3回「解放」されるまでロックを所有し続けます。
スレッドが明示的に要求した場合、ロックはスレッドによって取得されることに注意してください。 Javaでは、これはsynchronizedキーワードを使用して、または待機と通知を使用して行われます。
モニター
モニターは、スレッドが相互排他(ロックを使用)と連携(つまり、スレッドが特定の条件がtrueになるのを(ウェイトセットを使用して)待機するようにする機能)の両方を持つことができる同期構造です。
言い換えると、ロックを実装するデータとともに、すべてのJavaオブジェクトは、待機セットを実装するデータに論理的に関連付けられます。一方、ロックは、スレッドが共有データに干渉することなく、共有データで独立して動作するのに役立ちますもう1つは、待機セットがスレッドを互いに連携させて共通の目標に向けて連携するのに役立ちます。たとえば、すべての待機スレッドがこの待機セットに移動し、ロックが解除されるとすべてに通知されます。この待機セットは、ロックの追加ヘルプ(ミューテックス)。
詳細については、次を参照してください-