web-dev-qa-db-ja.com

Java CopyOnWriteMapが付属していないのはなぜですか?

JDKには、SetListCopyOnWrite*実装が付属していますが、Mapの実装はありません。私は、この事実をよく嘆いています。他にもコレクションの実装があることは知っていますが、標準で出荷されればいいのですが。それは明らかな省略のようであり、それには正当な理由があったのだろうかと思います。なぜこれが省略されたのか誰かが考えていますか?

41
sgargan

これはユースケースによって異なると思いますが、すでに ConcurrentHashMap があるのに、なぜCopyOnWriteMapが必要になるのでしょうか。

多くのリーダーがあり、更新が1つまたは少数しかないプレーンなルックアップテーブルの場合は、これが適しています。

コピーオンライトコレクションとの比較:

並行性の読み取り:

コピーオンライトコレクションに相当します。複数のリーダーが、lock-free方式でマップから要素を同時に取得できます。

同時実行性の書き込み:

基本的に更新をシリアル化する(一度に1つの更新)書き込みコレクションのコピーよりも優れた同時実行性。同時ハッシュマップを使用すると、複数の更新を同時に実行できる可能性が高くなります。ハッシュキーが均等に分散されている場合。

doで書き込みマップにコピーの効果を持たせたい場合は、いつでも同時実行レベル1でConcurrentHashMapを初期化できます。

28
Fredrik Bromee

セットの最も簡単な実装は、通常、基になるマップを使用することです。 Collections.newSetFromMap()メソッド[おそらく1.6からのみ]もあります。

彼らがすべきことは、CopyOnWriteMapとCopyOnWriteSetがCollections.newSetFromMap(new CopyOnWriteMap())と同等であることでした。

しかし、ご覧のとおり、CopyOnWriteArraySetは、実際にはマップではなく配列によって支えられています。そして、Collections.newSetFromMap(ConcurrentHashMap())は、ユースケースに受け入れられませんか?

0
Ustaman Sangat