【java】抽象同期キューAQS

1891 ワード

1、抽象同期キューとは?
	      AQS(AbstractQueueSynchronized)           ,   (J.U.C)  
        AQS   。

2、AQS核心思想
	AQS     ,            ,                ,       
       。             ,                         ,
       CLH      AQS,                  ,     。

3、CLHキュー
	CLH(Craig,Landin,and Hagersten)            (        ,     
       )。AQS                  CLH        (node)    
   。

4、AQS構造
4.1、
	AQS   FIFO CLH    ,       head tail         ,       Node。

4.2、ノード構造
  • Nodeのthread変数は、AQSキューに入るスレッドを格納するために使用されます.
  • SHAREDは、このスレッドが共有リソースを取得したときにブロックされて停止した後にAQSキューに入れられたことをマークするために使用される.
  • EXCLUSIVEは、このスレッドが独占リソースを取得したときに保留されてAQSキューに入れられたことをマークするために使用される.
  • waitStatusは、現在のスレッド待ち状態を記録します.a.CNCELLED:スレッドがキャンセルされました.b.SIGNAL:スレッドを起動する必要があります.c.CONDITION:スレッドは条件キューで待機します.d.PROPAGATE:共有リソースを解放する場合は、他のノードに通知する必要があります.
  • preは現在のノードの前駆ノードを記録し、nextは現在のノードの後続ノードを記録する.

  • 4.3、AQSでは単一の状態情報stateを維持し、getState()、setState()およびcompareAndSetState()で値を変更できます.
  • ReentrantLockの場合、stateは現在のスレッドがロックを取得する再入力可能な回数を表す.
  • ReentrantReadWriteLockでは、stateの高さ16ビットがリード状態、すなわち、このリードロックを取得した回数を表す.ロー16ビットは、書き込みロックを取得したスレッドの再入力可能回数を示す.
  • Semaphoneの場合、stateは現在利用可能な信号の個数を表す.
  • CountDownLatchの場合、stateはカウンタの現在の値を表すために使用されます.

  • 4.4、内部クラスConditionObject
    	AQS     ConditionObject,           。ConditionObject      
    AQS       ,  state    AQS  。
    	ConditionObject     ,              (      ),     
           await         。
    

    5、シンクロナイザの設計はテンプレート方法モードに基づく
    	AQS                , :         ,       (        ),           ,                     。
    	     AQS            : tryAcquire(      )、tryRelease(      )、tryAcquireShared(      )、tryReleaseShared(      )、isHeldExclusively(           )。