我有一个CHM定义如下。每当有任何更新时,我从单个后台线程调用setDataProcess
方法。我总是从多个阅读器线程呼叫getDataMapping
。ConcurrentHashMap更改对所有线程都可见吗?
private static final ConcurrentHashMap<ProcessType, Mapping> mappingsHolder = new ConcurrentHashMap<ProcessType, Mapping>();
private static final CountDownLatch hasInitialized = new CountDownLatch(ProcessType.values().length);
public static void setDataProcess(ProcessType processType, Mapping newMapData) {
mappingsHolder.put(processType, newMapData);
hasInitialized.countDown();
}
public static Mapping getDataMapping(ProcessType processType) {
try {
hasInitialized.await();
return mappingsHolder.get(processType);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new IllegalStateException(e);
}
}
问题是 - 在mappingsHolder
CHM的任何变化将是可见的所有读者线程立即或我需要使用挥发性的是什么?
试看看有多难? – Alp
@Alp:对于可见性问题,尝试看是非常平凡的。特别是,如果它失败了,它可能在不同的硬件上,比x86更松散的规则。 –
您是否使用了CountDownLatch,因此只有在填充mappingsHolder后才能调用getDataMapping? – adhg