JDKには、Set
とList
のCopyOnWrite*
実装が付属していますが、Map
の実装はありません。私は、この事実をよく嘆いています。他にもコレクションの実装があることは知っていますが、標準で出荷されればいいのですが。それは明らかな省略のようであり、それには正当な理由があったのだろうかと思います。なぜこれが省略されたのか誰かが考えていますか?
これはユースケースによって異なると思いますが、すでに ConcurrentHashMap があるのに、なぜCopyOnWriteMapが必要になるのでしょうか。
多くのリーダーがあり、更新が1つまたは少数しかないプレーンなルックアップテーブルの場合は、これが適しています。
コピーオンライトコレクションとの比較:
並行性の読み取り:
コピーオンライトコレクションに相当します。複数のリーダーが、lock-free方式でマップから要素を同時に取得できます。
同時実行性の書き込み:
基本的に更新をシリアル化する(一度に1つの更新)書き込みコレクションのコピーよりも優れた同時実行性。同時ハッシュマップを使用すると、複数の更新を同時に実行できる可能性が高くなります。ハッシュキーが均等に分散されている場合。
doで書き込みマップにコピーの効果を持たせたい場合は、いつでも同時実行レベル1でConcurrentHashMapを初期化できます。
セットの最も簡単な実装は、通常、基になるマップを使用することです。 Collections.newSetFromMap()メソッド[おそらく1.6からのみ]もあります。
彼らがすべきことは、CopyOnWriteMapとCopyOnWriteSetがCollections.newSetFromMap(new CopyOnWriteMap())と同等であることでした。
しかし、ご覧のとおり、CopyOnWriteArraySetは、実際にはマップではなく配列によって支えられています。そして、Collections.newSetFromMap(ConcurrentHashMap())は、ユースケースに受け入れられませんか?