私がマルチスレッドアプリケーションで一般的に使用するデータ構造は、すべて同じキーを共有するアイテムのグループを保存するConcurrentHashMapです。この問題は、特定のキー値の最初の項目をインストールするときに発生します。Java ConcurrentHashMapのパターン
私が使用しているパターンは次のとおりです。
final ConcurrentMap<KEYTYPE, Set<VALUETYPE>> hashMap = new ConcurrentHashMap<KEYTYPE, Set<VALUETYPE>>();
// ...
Set<VALUETYPE> newSet = new HashSet<VALUETYPE>();
final Set<VALUETYPE> set = hashMap.putIfAbsent(key, newSet)
if (set != null) {
newSet = set;
}
synchronized (newSet) {
if (!newSet.contains(value)) {
newSet.add(value);
}
}
は、この操作を行うためのより良いパターンはありますか?これはスレッドセーフでもありますか?内部には、より良いクラスがありますjava.util.HashSet
よりSet
ですか?
グアバコレクションはどのようなスレッドセーフな保証をしていますか? 'HashMultimap'のためのJavaDocsから:"このクラスは、同時動作がマルチマップを更新するときにスレッドセーフではありません。 common.collect.SetMultimap)」を参照してください。 'Collections.synchronizedMap()'の性能が非常に悪いため、java.util。*コレクション内で 'concurrent'パッケージが追加されました。 – Ralph
これはおそらくあなた自身を評価する必要があるでしょう。もう1つの選択肢はコンピューティングマップを使用することです - 私は答えもその例で更新します。 – Rich
Guavaは完全に並行した 'Multimap'を提供していません。なぜなら、それは非常に難しいからです。 –