繁体   English   中英

如何获取ConcurrentHashMap的最新视图?

[英]How do I get the latest view of a ConcurrentHashMap?

您可以通过使变量可变或通过使两个线程在某事物上同步来确保一个线程对变量的更改可以在其他线程上看到。 如果要更改的是java.util.ConcurrentHashMap,则通过将保存此映射的变量的类型声明为volatile来创建内存屏障是否有意义,或者读者正在访问该映射(例如,通过myMap.values() )反正要获得最新的可能视图? 对于上下文,我的阅读量很轻,写作很轻松,正在将无锁阅读解决方案切换到ConcurrentHashMap。

ConcurrentHashMap保证写入和后续读取之间存在事前发生的关系。 因此,是的,当您阅读(获取)时,您将看到“已提交”(已返回放置)的最新更改。

注意:这不适用于javadoc中解释的迭代器。

变量“持有”地图是对地图对象(分别(简化)到存储地图的内存地址)的引用或指针。 使它易失性只会影响指针,而不会影响地图对象本身。 只要您始终使用相同的Map-Object并确保在线程使用它之前就对它进行了完全初始化,则不必使用“易失性引用”。 并发在并发哈希映射内部透明地处理。

是的, ConcurrentHashMap提供了最新视图。 如果您在http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html#get(java.lang.Object)上引用了Javadocs,则会清楚地指出:

检索反映了刚发生时最新完成的更新操作的结果

它有更多详细信息,我建议您去阅读。

此外,如前所述,使用volatile不是您想要的,因为它只会影响指针,而不会影响映射的实际内容。

您需要做的就是确保保存地图的参考是最终的,因此您将获得最终的字段围栏,以确保您看到正确初始化的地图,并且参考本身不会更改。

正如其他人指出的那样, ConcurrentHashMap将确保内部可见性/发生在写入之前,就像所有java.util.concurrent.*集合所做的那样。 但是,您应该使用ConcurrentMap接口上公开的条件写入,以避免写入中发生数据争用。

暂无
暂无

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

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