ソースロックからJavaの並行を学ぶには、内部のスレッドキューを維持する方法です

ソースロックからJavaの並行を学ぶには、内部のスレッドキューを維持する方法です

前記事では、カイコー同期コンポーネントベースフレーム - AbstractQueuedSynchronizer(AQS)は、一般的な紹介を行いました。私たちは、AQSは内蔵の資源獲得FIFOキューキューワーカースレッドによって達成することができます知っています。だから、AQSは、この行の仕事を維持する方法ですか?今日は焼きステーキAQSソースを取ります。ソースコードから見に権利を維持する方法です。

Benpianは次のとおりです。「ロックシリーズ」チュートリアル「凱歌(カイコーのJava kagejava)並行プログラミング学習」シリーズ初:下の「Javaと契約ロック三で学ぶ - ソースのJava並行処理から学ぶ雌ねじを維持するためにどのようにされましたキュー。 "

第I部では、内部AQS内部クラス-Nodeオブジェクトがあることを知っています。このオブジェクトは、リソースの作業にキュースレッドのアクセスを維持することです。具体的にどのようにそれを動作させるには?主な内容は次のとおりノードノード導入、キューが同期に維持する方法のフローチャート。

A:ノードノードオブジェクトが記述する

Nodeオブジェクト内の内部クラスをAQS。このオブジェクトが属性を持っているもので、見てみましょう:

0fYtFv7v95U


簡素化した後:

最終ノードクラス{静的
       //待機状態のスレッド
        揮発性INT waitStatus、
        現在のノード//のノード
        揮発性PREVノード; 
        //現在のノードオブジェクト
        揮発次のノード; 
        //現在のノードは、スレッドオブジェクト維持
        揮発性スレッドスレッドを、
        //現在の次の(後続の)ノード
        のノードnextWaiter; 
 }


0fYtFvbBT72

オブジェクトのプロパティの説明

INT waitStatus:

4つの属性を持つオブジェクトの状態を示しています。

static final int型CANCELED = 1:同期キューからキャンセルスレッド

static final int型SIGNAL = -1:以降のノードは待ち状態。現在のノードのリソースを取得した後、ノードが解放される前に、フォローアップを切断して接続する必要があります。そのリリース後、ポスト・ソリューションは引き続き実行され、それ以降のノードに通知します。

静的最終INT CONDITION = -2:現在のノードの待機。待っている状態通知で。これは、条件キューとして理解することができます。

静的最終INT PROPAGATE = -3:共有モードで、次の無条件伝搬

0:デフォルト。

ノード前:現在のノードのノードの1つに

ノード次へ:現在の解決の後続ノード

ノードnextWaiter:それはノードのタイプとして理解することができます。これは、共有または排他されます。

スレッドスレッド:スレッド同期オブジェクトの現在の状態を取得します。

図は、具体的として、次のとおりです。

0fYtFwFpEIK


まず、データ構造で、構造はFIFOキューモードを維持することが可能であることを理解する必要があります。しかし、個々のキューとキュー循環キュー2種類があります。次に、この方法をキューシンクロナイザーを使用していますか?

ノードのノード属性から、我々は、ノードおよび後続するノードの前にプロパティを見ることができます。命令は、円形キューです。

2:スレッドキューのフローチャートを維持するために、

セキュリティスレッドの同期を確実にするためにCASのいくつかの方法が用意されています。図は次のとおりです。

0fYtFwtIZhg


ヘッドノード、ノード、セット状態を設定、等に設けられ、テール・ノードを設定CAS。

次のように図の動作の流れをまとめることができます。

0fYtFxBCei8


プロセスの説明:

キューに

次のように、チームのプロセスにあります。

0fYtFxnWIEa


図に記載のプロセス。

複数のスレッドが同時にリソースがスレッド(同期またはロック状態)を取得し、前記リソースについて競合する場合、スレッドのリソースを取得するために、この時間は、ヘッドノードとして構成されます。何も取得していないスレッドリソースの他の行は、ノードノードオブジェクトとして設定され、キューに入れられます。ノードノードはキューにキューのテールを通すように構成されています。スレッドの安全性を確保するために、同期はCASがエンド・ノード方式を設定します(例:compareAndSetTail())現在のスレッドを渡すために、この方法の必要性のスレッドの安全性を維持するために基づき、「彼は考えて、」テール・ノードと前のノード、ときCAS現在のノードの成功の後、正式に前のノードとの外交関係を確立します。ノードに配置されている次のノードは、ヘッドノードの端を指します。

上記の図3のスレッドとスレッド1は、自分を追加するために、待ち行列の最後尾に似た操作を実行します。これは、完全な双方向のキューイングアップを作成します。

キュー

次のようにフローチャートをデキュー:

0fYtFyIvn9s


チームのプロセスの説明:

我々は、すべての同時実行スレッドが並んでいるリソースの競合、チームのフローチャートから見ることができます。同期キューはFIFO(先入れ先出し)に従います。最初は成功した、いわゆるノードのノード同期のステータスを取得することです。リリース時のスレッド同期ステータスの最初のノードのように、後続のノードと自身の関係を切断し、その後のノードの動作を覚まします。同期ステータスの成功を取得、その後のノードは、自分自身を設定しますと、ノードが率いる、元のノードが最初のキューから撤退しました。元の第一のノードはまた、それを取得する必要がある場合、スレッド構成されたノードのノード・オブジェクトを所有し、次にキューに入れられます。

wx.jpg



おすすめ

転載: blog.51cto.com/kaigejava/2483896