Java(JUC)同期コンテナー並行コンテナーDaquan

同期コンテナーとは何ですか?

同步容器synchronizedキーワードでコンテナ変更すると、一度に1つのスレッドのみがコンテナを使用するようになり、コンテナのスレッドセーフになります。同期とは、同期を意味し、多线程变为串行実行待ちに反映されます。(ただし、複合操作はスレッドの安全性を保証しないことに注意してください。例:Aスレッドの最初のステップはテールノードを取得し、2番目のステップはテールノードの値に1を加算しますが、Aスレッドが最初のステップを完了すると、Bスレッドは削除しますテールノードに到達すると、Aスレッドは2番目のステップを実行するときにnullポインターを報告します)

コンカレントコンテナーとは何ですか?

并发容器権限を参照し多线程同时使用容器、スレッドの安全性を確保します。最大化並行処理を実現するために、Javaの並行処理キットは、効率の最適化コンカレント・コンテナーを向上させるためのさまざまな方法を使用して、コアがあります:CAS(无锁)COW(读写分离)分段锁

コンテナーの並べ替えを同期する

1.ベクトル

VectorはArrayListと同じようにListインターフェースを実装し、配列に対するそのさまざまな操作はArrayListと同じです。違いは、スレッドセーフでない可能性のあるVertorのすべてのメソッドが同期で変更されることです。

2.スタック

StackはVertorのサブクラスであり、Stackは高度なスタックを実装します。スタックのプッシュやポップなどの操作で同期変更が実行されました。

3. HashTable

HashTableはMapインターフェースを実装し、実装する関数は基本的に同じです(HashTableはnullを格納できず、HashMapのキーと値の両方がnullを格納できます)。違いは、HashTableは変更された同期メソッドを使用することです。

4.コレクションによって提供される同期されたコレクションクラス

リストリスト= Collections.synchronizedList(新しいArrayList());
セットセット= Collections.synchronizedSet(新しいHashSet());
マップマップ= Collections.synchronizedMap(新しいHashMap());
実際、上記の3つのコンテナーはプロキシモードによるコレクションです同期された同期が元の操作に追加されます。同期の粒度が大きすぎるため、マルチスレッド処理の効率が低下します。そのため、JDK1.5では、コンカレントパッケージのコンカレントコンテナーが導入され、マルチスレッド化のコンテナーの処理効率が低いという問題に対処しました。

コンテナーの同時ソート

1. CopyOnWriteArrayList

CopyOnWriteArrayListは、スレッドセーフを実装するArrayListに相当します。そのメカニズムは、コンテナーへの書き込み操作があるときにコピー配列をコピーし、操作が完了した後にコピー配列参照をコンテナーに割り当てることです。最下層はReentrantLockを使用して同期を保証します。ただし、コンテナの高い同時実行効率(コピー中に読み取られた古いデータ)と引き換えに、コンテナの一貫性が犠牲になります。したがって、強い整合性が必要なシナリオでは使用できません。

2. CopyOnWriteArraySet

CopyOnWriteArraySetは、CopyOnWriteArrayListと同じ原則を持っています。これは、CopyOnWriteメカニズムを実装するSetコレクションです。

3. ConcurrentHashMap

ConcurrentHashMapは、スレッドセーフを実装するHashMapと同等です。キーは順序付けされておらず、キーも値もnullにすることはできません。JDK8以前は、ConcurrentHashMapはセグメント化されたロックメカニズムを使用して同時実行効率を向上させ、同じセグメントのキーと値のペアを操作する場合にのみロックする必要がありました。JDK8に到達した後、ロックセグメンテーションメカニズムは放棄され、代わりにCASアルゴリズムが使用されました。

4. ConcurrentSkipListMap

ConcurrentSkipListMapは、スレッドセーフティを実装するTreeMapと同等です。キーは順序付けられており、キーも値もnullにすることはできません。それは赤と黒の木を置き換えるためにスキップテーブルメカニズムを使用します。赤と黒の木を使い続けてみませんか?ノードを挿入または削除するときに赤黒ツリーを回転および調整する必要があるため、制御する必要のある細分性は大きくなります。ジャンプテーブルは、ロックフリーCASメカニズムを使用してリンクリストを使用し、高い並行スレッド安全性を実現します。

5. ConcurrentSkipListSet

ConcurrentSkipListSetは、ConcurrentSkipListMapと同じ原則を備えています。これは、高い並行スレッド安全性を実現するTreeSetです。

キューのタイプ

ブロッキングタイプ

1. ArrayBlockingQueue

ArrayBlockingQueueは、配列で実装された境界付きのスレッドセーフなキューです。要素をキュー全体に詰め続けると、現在のスレッドがブロックされます。空のキューから要素を取得すると、現在のスレッドがブロックされます。ReentrantLockを使用して、同時状況でのスレッドの安全性を確保します。

2. LinkedBlockingQueue

LinkedBlockingQueueは、任意の(実際には制限された)FIFOブロッキングキューに基づく一方向のリンクリストです。アクセスおよび削除操作はチームのヘッドで実行され、追加操作はチームの最後で実行され、保護のために異なるロックが使用されます。複数のノードが関与する可能性がある操作では、同時に2つの操作のみをロックできます。

3. PriorityBlockingQueue

PriorityBlockingQueueは、優先度をサポートする無制限のブロッキングキューです。デフォルトでは、要素は自然な順序で昇順に配置されます。カスタムクラスのcompareTo()メソッドを実装して、要素の並べ替えルールを指定することもできます。

4. DelayQueue

DelayQueueは、プライオリティキューを使用して内部的に実装された無制限のブロッキングキューです。同時に、要素ノードデータにアクセスできるようになるまでの待機時間。データフェッチキューが空の場合、待ちます、データはありますが、遅延時間に達していないと待ち時間がオーバータイムになります。

5. SynchronousQueue

SynchronousQueueは容量がなく、要素を格納しないブロッキングキューです。要素を直接コンシューマに配信します。新しい要素を追加する前に、キューに追加された要素が消費されるのを待つ必要があります。容量1のコンベヤベルトに相当。

6. LinkedTransferQueue

LinkedTransferQueueは、リンクされたリストで構成される無制限の送信ブロックキューです。ConcurrentLinkedQueue、SynchronousQueue、LinkedBlockingQueueなどの利点を組み合わせたものです。特定のメカニズムはより複雑です。

7. LinkedBlockingDeque

LinkedBlockingDequeは、リンクリスト構造で構成される双方向ブロッキングキューです。いわゆる双方向キューとは、キューの両端から要素を挿入および削除できることを指します。

ノンブロッキング

1. ConcurrentLinkedQueue

ConcurrentLinkedQueueは、スレッドセーフな無制限の非ブロッキングキューです。その基礎となるデータ構造は、単一リンクリストを使用して実装されます。エンキューおよびデキュー操作は、スレッドの安全性を確保するためによく言及するCASを使用します。

248の元の記事を公開 416を賞賛 90,000ビュー+

おすすめ

転載: blog.csdn.net/qq_33709508/article/details/105447391