私がマルチスレッド アプリケーションで一般的に使用するデータ構造は、すべて同じキーを共有する項目のグループを保存する 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);
}
}
この操作を行うためのより良いパターンはありますか? これもスレッドセーフですか?Set
よりも内側に使用するのに適したクラスはありjava.util.HashSet
ますか?