简体   繁体   English

如何建立Multi ConcurrentHashMap?

[英]How to build Multi ConcurrentHashMap?

guava library has useful MultuMap to replace Map<Object, Collection> to avoid null checks. guava库具有有用的MultuMap来替换Map<Object, Collection>以避免空检查。

I cannot find analog MultiMap for ConcurrentHashMap . 我找不到ConcurrentHashMap模拟MultiMap

Does it exist ? 是否存在?

Does Multimaps.forMap(new ConcurrentHashMap<Object, Object>()); 是否做Multimaps.forMap(new ConcurrentHashMap<Object, Object>()); correct? 正确?

PS 聚苯乙烯

initialization: 初始化:

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

first thread: 第一个线程:

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

second thread: 第二个线程:

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

Now this code leads to ConcurrentModificationexception . 现在,此代码导致ConcurrentModificationexception

If i remembar correctly HashMultimap.create(); 如果我正确地正确HashMultimap.create(); and then ImmutableSetMultimap.Builder . 然后是ImmutableSetMultimap.Builder

You could replace those sections with 您可以将这些部分替换为

initialization: 初始化:

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

first thread: 第一个线程:

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

second thread: 第二个线程:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM