AbstraactQueuedSynchronizerあれらの事(一)概要
仕事をして善いことをしようとすると,必ず先にその器を利する.私たちがどんなフレームワークを勉強しても、ソースコードを勉強しても、自分に3つの質問をしなければなりません.それは何ですか.何に使えますか?どうやって作ったの?この節では、この3つの問題を持って大体を理解します.
注釈翻訳
ソースコードには多くの注釈があり、著者の設計構想と設計目的を理解するのに役立ち、詳細をよりよく理解するのに役立ちます.
FIFO待ち行列に基づいて、ブロックロックおよび他の同期ツールを実装するフレームワークが提供される.このクラスは,原子的int型状態に基づく同期ツール実装に汎用抽象を提供する.AQSを実装するサブクラスは、親クラスのprotectedメソッドを定義してこの状態を変更し、ロックの取得と解放時にその状態の具体的な意味を定義する必要があります.これに基づいて、クラス内の他のメソッドは、すべてのキューおよびブロックメカニズムを実行します.サブクラスは他のステータス属性を維持することができるが、親クラスのgetState()、setState()、compareAndSetState()メソッドによってのみ有効である.
サブクラスは非publicの内部クラスとして実装され、外部クラスの同期メカニズムを実現するのを助けるべきであり、AQS自体は同期インタフェースを実現しない.逆に、特定の同期ツールクラスがそれらのpublic方法を実現するのを助けるいくつかの方法を定義している.
AQSは排他モードまたは共有モードをサポートしてもよい.独占モードでは、1つのスレッドがライセンスを取得し、他のスレッドがライセンスを取得することはできません.共有モードでは、複数のスレッドがライセンスを取得できます.1つのスレッドがライセンスを取得した場合、次の待機するスレッドもライセンスを取得する必要があるかどうかを決定する必要があります.どのモードを採用しても、同じFIFO待機キューで待機します.通常、サブクラスはいずれかのモードを実現していますが、例外的に読み書きロックであり、両方のモードがあります.いずれかのモードを実装するサブクラスは、その未採用の別のモードを実装する必要はありません.
AQSは、独占モードのサブクラス実装をサポートする内部クラスConditionObjectを定義します.ヘルプメソッドisHeldExclusivelyは、現在のスレッドが独占しているかどうかを判断するなど、AQS以外にこのようなオブジェクトを作成する方法がないことを保証します.この制約を満たすことができない場合はAQSを使用しません.ConditionObjectの動作は、その特定の同期実装の意味に依存する.
AQSは待ち行列のいくつかの検査、傍受などの方法を提供しており、もちろん条件オブジェクトもある.これらの方法は、同期インプリメンテーションでも使用できます.
AQSシーケンス化はstateのみを保存するので、逆シーケンス化後は待ち行列が空になります.サブクラスは、同期メカニズムを実装するために次の方法を書き換える必要があります.同期stateの変更は、getState、setState、またはcompareAndSetStateを呼び出す必要があります.
上記のメソッドのデフォルトは例外であり、これらのメソッドの実装にはスレッドセキュリティが必要であり、一般的にブロックは長くなく、サブクラスはこれらを実装するだけであり、AQSでは他のメソッドはfinalと宣言されている.
まとめ
AQSは、ブロックロックまたは他の同期ツールを実装するのに役立つ抽象的なフレームワークであり、同期ツールが同期の意味を実装するのに役立つ多くの方法を定義しており、特定の同期実装を提供するのではなく、同期の意味の実装をサブクラスに書き換え、共有ロックまたは独占ロックをサポートしています.それがどのように実現されて保証されているのかについては、後で分析を続けます.
注釈翻訳
ソースコードには多くの注釈があり、著者の設計構想と設計目的を理解するのに役立ち、詳細をよりよく理解するのに役立ちます.
FIFO待ち行列に基づいて、ブロックロックおよび他の同期ツールを実装するフレームワークが提供される.このクラスは,原子的int型状態に基づく同期ツール実装に汎用抽象を提供する.AQSを実装するサブクラスは、親クラスのprotectedメソッドを定義してこの状態を変更し、ロックの取得と解放時にその状態の具体的な意味を定義する必要があります.これに基づいて、クラス内の他のメソッドは、すべてのキューおよびブロックメカニズムを実行します.サブクラスは他のステータス属性を維持することができるが、親クラスのgetState()、setState()、compareAndSetState()メソッドによってのみ有効である.
サブクラスは非publicの内部クラスとして実装され、外部クラスの同期メカニズムを実現するのを助けるべきであり、AQS自体は同期インタフェースを実現しない.逆に、特定の同期ツールクラスがそれらのpublic方法を実現するのを助けるいくつかの方法を定義している.
AQSは排他モードまたは共有モードをサポートしてもよい.独占モードでは、1つのスレッドがライセンスを取得し、他のスレッドがライセンスを取得することはできません.共有モードでは、複数のスレッドがライセンスを取得できます.1つのスレッドがライセンスを取得した場合、次の待機するスレッドもライセンスを取得する必要があるかどうかを決定する必要があります.どのモードを採用しても、同じFIFO待機キューで待機します.通常、サブクラスはいずれかのモードを実現していますが、例外的に読み書きロックであり、両方のモードがあります.いずれかのモードを実装するサブクラスは、その未採用の別のモードを実装する必要はありません.
AQSは、独占モードのサブクラス実装をサポートする内部クラスConditionObjectを定義します.ヘルプメソッドisHeldExclusivelyは、現在のスレッドが独占しているかどうかを判断するなど、AQS以外にこのようなオブジェクトを作成する方法がないことを保証します.この制約を満たすことができない場合はAQSを使用しません.ConditionObjectの動作は、その特定の同期実装の意味に依存する.
AQSは待ち行列のいくつかの検査、傍受などの方法を提供しており、もちろん条件オブジェクトもある.これらの方法は、同期インプリメンテーションでも使用できます.
AQSシーケンス化はstateのみを保存するので、逆シーケンス化後は待ち行列が空になります.サブクラスは、同期メカニズムを実装するために次の方法を書き換える必要があります.同期stateの変更は、getState、setState、またはcompareAndSetStateを呼び出す必要があります.
* - {@link #tryAcquire}
*
- {@link #tryRelease}
*
- {@link #tryAcquireShared}
*
- {@link #tryReleaseShared}
*
- {@link #isHeldExclusively}
*
上記のメソッドのデフォルトは例外であり、これらのメソッドの実装にはスレッドセキュリティが必要であり、一般的にブロックは長くなく、サブクラスはこれらを実装するだけであり、AQSでは他のメソッドはfinalと宣言されている.
まとめ
AQSは、ブロックロックまたは他の同期ツールを実装するのに役立つ抽象的なフレームワークであり、同期ツールが同期の意味を実装するのに役立つ多くの方法を定義しており、特定の同期実装を提供するのではなく、同期の意味の実装をサブクラスに書き換え、共有ロックまたは独占ロックをサポートしています.それがどのように実現されて保証されているのかについては、後で分析を続けます.