この質問は、ここSOでの私の前の質問の直後に続きます。私の2番目の質問に対する答えはノーだと思います。では、java.util.concurrentパッケージにConcurrentLinkedHashMapがない理由を理解したいと思いますか?つまり、ConcurrentHashMapはありますが、ConcurrentLinkedHashMapはありません。並行環境でそのようなクラスを持つことはまったく意味がありませんか?ここで利用できない主な技術的理由は何ですか?Guava / Apache Commonsに似たようなものはありますか?
3 に答える
jdkにConcurrentLinkedHashMapクラスがないのはなぜですか?
Oracle Javaの人たちにそれを尋ねる必要がありますが、それは次の組み合わせだと思います。
- 多くの人がそれを必要としないだろうという認識、そして
- 同時使用の多いユースケースで、優れたパフォーマンスプロパティを備えたデータ構造を実装する際の固有の問題。
この場合、キー/値/エントリセットの反復が同時実行のボトルネックにならないようにコレクションクラスを実装することは、...ええと...難しいと思われます。(そして、人々がそれを行う方法を考え出したとしても、汎用の高度に並行したデータ構造とアルゴリズムの設計、実装、および正当性の証明は難しいという事実が残っています。)
Googleからのものがあるようです https://code.google.com/p/concurrentlinkedhashmap/
この投稿も確認してください: ConcurrentLinkedHashMapがGuavaに統合されたとはどういう意味ですか?
#define PERSONAL_OPINION
設計の観点からは、常に使用する必要がある方が理にかなっています
Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Needn't be in synchronized block
...
synchronized(m) { // Synchronizing on m, not s!
Iterator i = s.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
同期マップの例
なんで?同期メカニズムは高度な抽象化(Map
インターフェース)に関連付けられているためです。しかし、私が正しいと仮定すると、まだ持っている2つの理由がありますConcurrentHashMap
:
ConcurrentHashMap
この同期メカニズムの前にどちらかが存在します- 特定の同期メカニズムを作成すると、パフォーマンスが向上します。
私のポイントは、ConcurrentHashMap
存在してはならない理想的なデザインの世界にあります。
#end //personal opinion