マルチスレッド(9、AQSの原則 - プロフィール)

AQSはじめに

AQSは、キュー・マネージャーの操作を待つ、同期状態管理、スレッドブロック/ウェイクの共通セットを提供する抽象クラスです。

通常ReentrantLockの、たCountDownLatch、セマフォ(セマフォ)を使用するが実装AQSのAPIを提供することに基づいている、それらの差は、異なる機能を達成するために、内部状態AQS(同期状態、int型)別の操作に同期しています。

マルチスレッド(9、AQSの原則 - プロフィール)

3つの主要な問題を解決するために、AQSベースの同期状態(同期状態):

1は、リソースへのアクセスが共有または排他され、ReentrantLockのは排他的であると言う、ReentrantReadWriteLock.ReadLockが共有されています

2、待機キューを使用して待機しているスレッドを管理する方法

図3は、リソース、タイムアウトスレッドと割り込みメカニズムを取得することはできません

AQSの主な方法

同期状態(同期状態)を使用する方法ユーザーの連続はAQSを検討しています。

次のようにサブクラスにさらさAQSは、メソッドを使用することができます。

図1に示すように、リソースへの排他的アクセスtryAcquire
2、tryRelease排他的リソース解放
3は、共有tryAcquireSharedリソース獲得
4、共有tryReleaseSharedリソース解放
5、isHeldExclusivelyリソースを独占することによって占められるかどうか

内部クラスたConditionObject介してAQSインナーフレーム、条件ウエイト機能サブクラスのための条件を提供するために、インタフェースを実装します。

マルチスレッド(9、AQSの原則 - プロフィール)

AQS内部プライベートメソッド:

同期状態(同期状態)についてAQSは、3つのメソッドを提供します

図1は、SETSTATEが同期状態に配置された
2は、getStateを同期状態獲得
危険CASの設定compareAndSetStateに基づく3、CAS同期状態を

待ち行列の方法

、初期化することができる1、ENQエンキュー操作(後述)に指定されたノード
2は、addWaiterエンキュー動作ノードは、ノードが現在のスレッドである
3、setHeadヘッドノードに配置された
4は、現在のノードのunparkSuccessorウェイク後継
5、doReleaseSharedは、共有ノードを解放
6 、setHeadAndPropagateは、ヘッドノードを設定し、順番に後続ノードを目覚めさせます

運転資源の方法

図1に示すように、リソースへのパブリック最終排他的アクセスを取得
2を、リソースへacquireInterruptibly公衆最終排他的アクセス(割り込み応答)
。3、リソースへacquireInterruptibly公衆最終排他的アクセス(リミット待ち)
。図4は、リソースへのパブリック最終共有アクセスacquireShared
5、acquireSharedInterruptiblyパブリック最終シェアリソース(割り込み応答)へのアクセス
6、共有リソースへのtryAcquireSharedNanos決勝のパブリックアクセス(営業時間待っている)
ようにように7、およびと........

待ち行列

キュー待機するユニット、パッケージスレッドノードとしてノード(ノード)です。

マルチスレッド(9、AQSの原則 - プロフィール)

2つのノードタイプ、ノードと共有ノードに排他的、共有、および排他的です

マルチスレッド(9、AQSの原則 - プロフィール)

ノードステータス(waitStatus)、ノードステータス値を使用して排他的、共有ノードが同じではありません。

図1は、ノード0がデフォルト状態です。
マルチスレッド(9、AQSの原則 - プロフィール)
排他的使用を解除請求項2において、前記接合部(1)、SIGNAL(-1) 、CONDITION(-2)、 前記使用共有ノードCANCELED(1)、SIGNAL(-1)し、伝播(-3)。

おすすめ

転載: blog.51cto.com/janephp/2405825