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