マルチコア プロセッサの普及に伴い、プログラマはデータへの同時アクセスの問題に注目するようになり、スレッド セーフの問題を解決するために、Java ではさまざまな同時実行コンテナが提供されています。この記事では、いくつかの一般的な Java 同時実行コンテナを紹介します。
ConcurrentHashMap は、スレッドセーフなハッシュ テーブルです。その実装は基本的に HashMap と同じですが、ConcurrentHashMap は同時実行性の高い変更操作をサポートしているため、HashMap よりもマルチスレッドのシナリオに適しています。
ConcurrentHashMap には内部に複数のセグメント ロックがあり、各ロックがハッシュ バケットを保護するため、複数のスレッドが異なるバケットを同時に変更できます。この設計により、ConcurrentHashMap は効率的な読み取りと書き込みの分離を実現できます。
ConcurrentHashMap を使用する手順は次のとおりです:
ConcurrentMap<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "one");
String value = map.get(1);
CopyOnWriteArrayList はスレッドセーフな動的配列です。その特徴は、書き込み操作は元の配列を直接変更するのではなく、変更用の新しい配列を作成し、元の配列を新しい配列に置き換えることです。変更操作と読み取り操作は競合しないため、CopyOnWriteArrayList は高い同時読み取り操作をサポートします。
CopyOnWriteArrayList を使用する手順は次のとおりです:
List<String> list = new CopyOnWriteArrayList<>();
list.add("one");
String value = list.get(0);
各変更には新しい配列の作成が必要なため、CopyOnWriteArrayList の変更操作は比較的遅く、次のような用途には適していないことに注意してください。高頻度の書き込み操作。
ConcurrentLinkedQueue はスレッドセーフなキューです。その実装はリンク リストに基づいており、同時実行性の高いエンキューおよびデキュー操作をサポートします。
ConcurrentLinkedQueue は内部で CAS 操作を使用してリンク リストへの同時変更を実装するため、ロックの使用によって引き起こされるパフォーマンスの問題を回避します。
ConcurrentLinkedQueue を使用する手順は次のとおりです。
Queue<String> queue = new ConcurrentLinkedQueue<>();
queue.offer("one");
String value = queue.poll();
ConcurrentLinkedQueue はランダム アクセスをサポートしていないため、キューの先頭からのみトラバースできることに注意してください。
ConcurrentSkipListMap は、スレッドセーフな順序付きマッピング テーブルです。その実装はスキップ テーブルに基づいており、挿入、削除、検索操作を迅速にサポートできます。
ConcurrentHashMap と同様に、ConcurrentSkipListMap も複数のレベルに分割されており、各レベルには独自のリンク リストのセットがあり、同時アクセスの効率を向上させることができます。
ConcurrentSkipListMap を使用する手順は次のとおりです:
ConcurrentNavigableMap<Integer, String> map = new ConcurrentSkipListMap<>();
map.put(1, "one");
String value = map.get(1);
ConcurrentSkipListMap の実装は比較的複雑であるため、データ量が少ない場合、TreeMap よりもパフォーマンスが低下する可能性があることに注意してください。 。
概要
Java はさまざまな同時コンテナを提供しており、プログラマはニーズに応じて適切なコンテナを選択できます。なお、コンテナごとに適用可能なシナリオが異なり、不適切に使用するとパフォーマンス上の問題が発生する可能性があるため、シナリオに応じて適切なコンテナを選択することをお勧めします。
以上がJava の同時コンテナの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。