2010-11-22 5 views
28

CopyOnWrite*の実装ではSetListのJDKが同梱されていますが、Mapのものはありません。この点についてよく嘆いています。そこには他のコレクションの実装があることは分かっていますが、標準として出荷されていればいいと思います。それは明白な省略のように思え、私はそれに正当な理由があるのだろうかと思っています。なぜこれが除外されたのか誰にも分かりません。JavaにCopyOnWriteMapが付属していないのはなぜですか?

+2

多くの人がjava.util.MapをCollectionとみなしますが、そうではありません。これはあなたの質問には直接関係していませんが、言葉の中にはおそらくあなたがこの前提を作ったと思うようになったので、私はこれを指摘すると思っていました。 – pkaeding

+1

合意しました。コレクションインターフェイスを実装していない可能性があり、真のコレクションのセマンティクスを主張できます。しかし、そのような細目の結果は、CopyOnWriteMapをあまり価値のないものにすることはできません。 – sgargan

+0

他のコレクションの場合と同じように、イテレーションはマップのユースケースほどよくありません。 – msandiford

答えて

23

私はこれがあなたのユースケースに依存すると思いますが、あなたが既にConcurrentHashMapを持っているときにCopyOnWriteMapが必要なのはなぜですか?

多数の読者と1つまたは少数の更新を含むプレーンなルックアップテーブルの場合は、適切です。

読むの同時実行:ライト・コレクションのコピーに等しい

書込みコレクションのコピーに比べ

。いくつかの読者は、ロックフリーのファッションで同時に地図から要素を取り出すことができます。

書き込みの同時実行:基本的にアップデート(一度に更新)をシリアライズ書き込みのコレクションのコピーより

より良い並行処理。同時ハッシュマップを使用すると、複数の更新を同時に実行する可能性が高くなります。あなたのハッシュキーが均等に分散されている場合。

あなたはが書き込みマップ上のコピーの効果を持つようにしたいん場合、あなたは常に1

+0

2種類のコレクションは異なる目的を果たします。 CopyOnWriteコレクションは書かれたよりもはるかに頻繁に読み込まれますが、一般的には、頻繁に読み込まれない書き込みごとに完全なコピーを犠牲にして読み込みをロックするオーバーヘッドを避けることができます。ConcurrentHashMapは、並行性の値に関係なくロックを必要とします。 – sgargan

+0

本当に私が探しているのは、ルックアップテーブルを非常に効率的に使用できるMap実装です。非常にまれに(ほとんどの場合1回)書き込まれ、ロックのない読み取りに最適化されます。 – sgargan

+1

ConcurrentHashMapのjavadocをもう一度読んでください。あなたの必要性に合っていると思います。ここから2つの抜粋があります: "検索の完全な並行性をサポートするハッシュテーブル..."と "...すべての操作はスレッドセーフで、検索操作はロックを伴わない..."。だから、それは同時ルックアップテーブルに最適です。 –

0

の並行処理レベルでのConcurrentHashMapを初期化することができますセットの最も簡単な実装では、通常、使用することです基礎となる地図。それらはさらにCollections.newSetFromMap()メソッド[多分1.6からのみ]を持っています。

これは、CopyOnWriteMapとCopyOnWriteSetがCollections.newSetFromMap(new CopyOnWriteMap())と同等である必要があります。

しかし、CopyOnWriteArraySetは実際にマップではなく配列によってサポートされています。そして、Collections.newSetFromMap(ConcurrentHashMap())はあなたのユースケースに受け入れられませんか?

+0

OPはセットではなくマップを要求します。 – eckes

関連する問題