CopyOnWrite*
の実装ではSet
とList
のJDKが同梱されていますが、Map
のものはありません。この点についてよく嘆いています。そこには他のコレクションの実装があることは分かっていますが、標準として出荷されていればいいと思います。それは明白な省略のように思え、私はそれに正当な理由があるのだろうかと思っています。なぜこれが除外されたのか誰にも分かりません。JavaにCopyOnWriteMapが付属していないのはなぜですか?
答えて
私はこれがあなたのユースケースに依存すると思いますが、あなたが既にConcurrentHashMapを持っているときにCopyOnWriteMapが必要なのはなぜですか?
多数の読者と1つまたは少数の更新を含むプレーンなルックアップテーブルの場合は、適切です。
読むの同時実行:ライト・コレクションのコピーに等しい
書込みコレクションのコピーに比べ
。いくつかの読者は、ロックフリーのファッションで同時に地図から要素を取り出すことができます。
書き込みの同時実行:基本的にアップデート(一度に更新)をシリアライズ書き込みのコレクションのコピーより
より良い並行処理。同時ハッシュマップを使用すると、複数の更新を同時に実行する可能性が高くなります。あなたのハッシュキーが均等に分散されている場合。
あなたはが書き込みマップ上のコピーの効果を持つようにしたいん場合、あなたは常に1
2種類のコレクションは異なる目的を果たします。 CopyOnWriteコレクションは書かれたよりもはるかに頻繁に読み込まれますが、一般的には、頻繁に読み込まれない書き込みごとに完全なコピーを犠牲にして読み込みをロックするオーバーヘッドを避けることができます。ConcurrentHashMapは、並行性の値に関係なくロックを必要とします。 – sgargan
本当に私が探しているのは、ルックアップテーブルを非常に効率的に使用できるMap実装です。非常にまれに(ほとんどの場合1回)書き込まれ、ロックのない読み取りに最適化されます。 – sgargan
ConcurrentHashMapのjavadocをもう一度読んでください。あなたの必要性に合っていると思います。ここから2つの抜粋があります: "検索の完全な並行性をサポートするハッシュテーブル..."と "...すべての操作はスレッドセーフで、検索操作はロックを伴わない..."。だから、それは同時ルックアップテーブルに最適です。 –
の並行処理レベルでのConcurrentHashMapを初期化することができますセットの最も簡単な実装では、通常、使用することです基礎となる地図。それらはさらにCollections.newSetFromMap()メソッド[多分1.6からのみ]を持っています。
これは、CopyOnWriteMapとCopyOnWriteSetがCollections.newSetFromMap(new CopyOnWriteMap())と同等である必要があります。
しかし、CopyOnWriteArraySetは実際にマップではなく配列によってサポートされています。そして、Collections.newSetFromMap(ConcurrentHashMap())はあなたのユースケースに受け入れられませんか?
OPはセットではなくマップを要求します。 – eckes
- 1. Javaストリームジェネレータが順序付けられていないのはなぜですか?
- 2. なぜJava EEタイマーがクラスタリングしていないのですか?
- 3. 'WriteOnlyWorksheet'オブジェクトに属性 'cell'がないのはなぜですか?
- 4. Eclipse Java EE IDEにはTomcatが付属していますか?
- 5. リストがJavaで回転しないのはなぜですか?
- 6. Javaでコンパイルエラーが発生しないのはなぜですか?
- 7. xsd:complexTypeが属性でないのはなぜですか?
- 8. なぜこのwebapi2属性ルーティングが機能していないのですか?
- 9. DOM属性アクセス:なぜ "elt.class"が機能していないのですか?
- 10. なぜBindNever属性が機能しないのですか
- 11. Java Echoアプレットが動作しないのはなぜですか?
- 12. Javaに「ディープ」ワイルドカードのインポートがないのはなぜですか?
- 13. なぜServiceStack.Textの日付がiso8601になっていないのですか?
- 14. クラスCanvasPaneがJava APIに含まれていないのはなぜですか?
- 15. HTML - なぜtextareaにmaxlength属性がないのですか?
- 16. なぜRadioButton/CheckboxButtonにVALUE属性がないのですか?
- 17. なぜpythonインスタンスに__name__属性がないのですか?
- 18. なぜclangに 'nonnil'属性がないのですか?
- 19. Javaにceil(float)がないのはなぜですか?
- 20. Java 8に「myArray.stream()」関数がないのはなぜですか?
- 21. なぜファームウェアが失われるのですか?それは製品に付属していませんか?
- 22. すべての属性に接頭辞が付いているのはなぜですか?どこでもプレフィックスない少しおしゃべりする:
- 23. 一部のアプリケーションに共有ライブラリが付属しているのはなぜですか?
- 24. typedefが強く型付けされていないのはなぜですか?
- 25. React-Bootstrap Buttonで属性が機能しないのはなぜですか?
- 26. jQuery hover()がimage src属性で動作しないのはなぜですか?
- 27. WebAPIでclass属性が機能しないのはなぜですか?
- 28. JVMにはJDkが付属しているか、デフォルトでosが付属しています
- 29. なぜインテリセンスには属性が見つからないのですか?
- 30. ブートストラップフォームが送信していないのはなぜですか?
多くの人がjava.util.MapをCollectionとみなしますが、そうではありません。これはあなたの質問には直接関係していませんが、言葉の中にはおそらくあなたがこの前提を作ったと思うようになったので、私はこれを指摘すると思っていました。 – pkaeding
合意しました。コレクションインターフェイスを実装していない可能性があり、真のコレクションのセマンティクスを主張できます。しかし、そのような細目の結果は、CopyOnWriteMapをあまり価値のないものにすることはできません。 – sgargan
他のコレクションの場合と同じように、イテレーションはマップのユースケースほどよくありません。 – msandiford