如何构建多concurrenthashmap?

r1wp621o  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(364)

Guava图书馆很有用 MultuMap 替换 Map<Object, Collection> 以避免空检查。
我找不到模拟的 MultiMap 为了 ConcurrentHashMap .
它存在吗?
Multimaps.forMap(new ConcurrentHashMap<Object, Object>()); 对的?

p、 s。

初始化:

private Multimap<Object, ComplexCalcStrategy> strategies = HashMultimap.<Object, ComplexCalcStrategy>create();

第一个线程:

for (Integer optionId : strategy.getOptions()) {
            strategies.put(optionId, strategy);
  }

第二个线程:

Collection<ComplexCalcStrategy> strategiesThatNeedUpdating = strategies.get(mktDataChange.getOptionId());
for (ComplexCalcStrategy strategy : strategiesThatNeedUpdating) { 
     updateMarketData(strategy.getStrategy(), mktDataChange);
}

现在这个代码导致 ConcurrentModificationexception .

9bfwbjaz

9bfwbjaz1#

如果我没记错的话 HashMultimap.create(); 然后 ImmutableSetMultimap.Builder .

lyr7nygr

lyr7nygr2#

你可以用
初始化:

private final Map<Integer, Set<ComplexCalcStrategy>> strategies = new ConcurrentHashMap<>();

第一个线程:

for (Integer optionId : strategy.getOptions()) {
    strategies.computeIfAbsent(optionId, k -> Collections.newSetFromMap(new ConcurrentHashMap<>()))
              .add(strategy);
}

第二个线程:

for (ComplexCalcStrategy strategy : strategies.getOrDefault(optionId, Collections.emptySet())) { 
     updateMarketData(strategy.getStrategy(), mktDataChange);
}

相关问题