1. ホーム
  2. java

CopyOnWriteArrayListはどのような状況に適しているのでしょうか?[重複]する

2023-09-19 16:20:07

質問

について勉強しています。 CopyOnWriteArrayList クラスについて学んでいます。

  • 新しい配列をコピーする目的は何ですか?
  • 他のスレッドが配列を読むためでしょうか?

ですから、もしシステムが高い並行性を持ち、スレッドの動作のほとんどが 書き込みではなく読み込みであるような場合には、配列の読み出しに CopyOnWriteArrayList .

どのように解決するのですか?

この リンク :

CopyOnWriteArrayList は、Java 5 Concurrency API で導入された並列コレクションクラスで、人気のある同類の ConcurrentHashMap と共に、Java 5 Concurrency API で導入されました。

CopyOnWriteArrayList のようにListのインタフェースを実装しています。 ArrayList , VectorLinkedList というように、スレッドセーフなコレクションであり、Vectorや他のスレッドセーフなコレクションクラスとは少し異なる方法でスレッドセーフを実現します。

名前が示すように、CopyOnWriteArrayListは変異のたびに基礎となるArrayListのコピーを作成します。 ArrayList は、add や set などの突然変異を起こすたびに、そのコピーを作成します。通常 CopyOnWriteArrayList は非常に高価です。 というのは、書き込み操作のたびに高価な配列のコピーが発生するからです。 の場合、非常に効率的です。 がある場合、非常に効率的です。 例えば、あなたはほとんど ArrayListを反復し、あまり頻繁に変更しない場合など。

CopyOnWriteArrayListのイテレータはフェイルセーフで、ConcurrentModificationExceptionを投げません。 ConcurrentModificationException たとえ、基礎となる が変更されたとしても、ConcurrentModificationExceptionをスローしません。 イテレータは、ArrayListの別々のコピーで動作しているからです。その結果、すべての の更新は、Iterator では利用できません。

最新のバージョンを取得するために、次のような新しい読み込みを行います。 list.iterator();

とはいえ、このコレクションを頻繁に更新すると、パフォーマンスが低下します。もしあなたが CopyOnWriteArrayList をソートしようとすると、リストが UnsupportedOperationException を投げることがわかります (ソートはコレクションに対して N 回 set を実行します)。この読み取りは、90%以上の読み取りを行う場合にのみ使用する必要があります。