Java の同時コンテナ

王林
王林オリジナル
2023-06-08 09:54:271303ブラウズ

マルチコア プロセッサの普及に伴い、プログラマはデータへの同時アクセスの問題に注目するようになり、スレッド セーフの問題を解決するために、Java ではさまざまな同時実行コンテナが提供されています。この記事では、いくつかの一般的な Java 同時実行コンテナを紹介します。

  1. ConcurrentHashMap

ConcurrentHashMap は、スレッドセーフなハッシュ テーブルです。その実装は基本的に HashMap と同じですが、ConcurrentHashMap は同時実行性の高い変更操作をサポートしているため、HashMap よりもマルチスレッドのシナリオに適しています。

ConcurrentHashMap には内部に複数のセグメント ロックがあり、各ロックがハッシュ バケットを保護するため、複数のスレッドが異なるバケットを同時に変更できます。この設計により、ConcurrentHashMap は効率的な読み取りと書き込みの分離を実現できます。

ConcurrentHashMap を使用する手順は次のとおりです:

  1. ConcurrentHashMap インスタンスを作成します:
ConcurrentMap<Integer, String> map = new ConcurrentHashMap<>();
  1. 要素を追加します:
map.put(1, "one");
  1. 要素の取得:
String value = map.get(1);
  1. CopyOnWriteArrayList

CopyOnWriteArrayList はスレッドセーフな動的配列です。その特徴は、書き込み操作は元の配列を直接変更するのではなく、変更用の新しい配列を作成し、元の配列を新しい配列に置き換えることです。変更操作と読み取り操作は競合しないため、CopyOnWriteArrayList は高い同時読み取り操作をサポートします。

CopyOnWriteArrayList を使用する手順は次のとおりです:

  1. CopyOnWriteArrayList インスタンスを作成します:
List<String> list = new CopyOnWriteArrayList<>();
  1. 要素を追加します:
list.add("one");
  1. 要素の取得:
String value = list.get(0);

各変更には新しい配列の作成が必要なため、CopyOnWriteArrayList の変更操作は比較的遅く、次のような用途には適していないことに注意してください。高頻度の書き込み操作。

  1. ConcurrentLinkedQueue

ConcurrentLinkedQueue はスレッドセーフなキューです。その実装はリンク リストに基づいており、同時実行性の高いエンキューおよびデキュー操作をサポートします。

ConcurrentLinkedQueue は内部で CAS 操作を使用してリンク リストへの同時変更を実装するため、ロックの使用によって引き起こされるパフォーマンスの問題を回避します。

ConcurrentLinkedQueue を使用する手順は次のとおりです。

  1. ConcurrentLinkedQueue インスタンスの作成:
Queue<String> queue = new ConcurrentLinkedQueue<>();
  1. エンキュー操作:
queue.offer("one");
  1. デキュー操作:
String value = queue.poll();

ConcurrentLinkedQueue はランダム アクセスをサポートしていないため、キューの先頭からのみトラバースできることに注意してください。

  1. ConcurrentSkipListMap

ConcurrentSkipListMap は、スレッドセーフな順序付きマッピング テーブルです。その実装はスキップ テーブルに基づいており、挿入、削除、検索操作を迅速にサポートできます。

ConcurrentHashMap と同様に、ConcurrentSkipListMap も複数のレベルに分割されており、各レベルには独自のリンク リストのセットがあり、同時アクセスの効率を向上させることができます。

ConcurrentSkipListMap を使用する手順は次のとおりです:

  1. ConcurrentSkipListMap インスタンスを作成します:
ConcurrentNavigableMap<Integer, String> map = new ConcurrentSkipListMap<>();
  1. 要素を追加します:
map.put(1, "one");
  1. 要素の取得:
String value = map.get(1);

ConcurrentSkipListMap の実装は比較的複雑であるため、データ量が少ない場合、TreeMap よりもパフォーマンスが低下する可能性があることに注意してください。 。

概要

Java はさまざまな同時コンテナを提供しており、プログラマはニーズに応じて適切なコンテナを選択できます。なお、コンテナごとに適用可能なシナリオが異なり、不適切に使用するとパフォーマンス上の問題が発生する可能性があるため、シナリオに応じて適切なコンテナを選択することをお勧めします。

以上がJava の同時コンテナの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。