您可以确保一个线程对某个变量所做的更改可以在其他线程上看到,方法是将该变量设置为volatile,或者让这两个线程同步某些内容。如果被改变的东西是一个java.util.ConcurrentHashMap,通过声明持有这张地图的变量的类型为volatile,或者读者访问地图(比如说通过myMap.values()
)来获取无论如何最新的可能观点?对于上下文,我有一个沉重的阅读,轻写作场景,我将lock free read solution切换到ConcurrentHashMap。如何获取ConcurrentHashMap的最新视图?
0
A
回答
3
ConcurrentHashMap保证写入和后续读取之间有一个发生之前的关系。所以是的,当您阅读(获取)时,您会看到最近发生的“已提交”更改(put已返回)。
注意:这不适用于javadoc中解释的迭代器。
2
变量“保存”地图是指向地图对象的引用或指针(分别(简化为)存储地图的内存地址)。使其变为易失性只会影响指针,而不会影响地图对象本身。只要您始终使用相同的Map-Object并确保地图在线程使用之前完全初始化,则不必使用“volatile引用”。并发性在并发哈希映射中透明地处理。
2
是的,ConcurrentHashMap
给出最新的意见。如果您在http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ConcurrentHashMap.html#get(java.lang.Object) 指的javadoc,它清楚地写在
反演反映最近完成的更新的结果 操作保持在他们的发病
它有一些更多的细节,我会建议你去读它。
此外,正如已经提到的使用volatile
不是你想要的,因为它只会影响指针而不影响地图的实际内容。
1
所有你需要做的就是确保持有地图的引用是最终的,所以你得到一个最终的场篱笆,保证你看到一个正确初始化的地图,并且引用本身没有改变。
正如其他人指出的那样,ConcurrentHashMap
将保证在内部写入之前的可见性/发生 - 因为所有java.util.concurrent.*
集合都这样做。但是,您应该使用ConcurrentMap
接口上公开的条件写入来避免写入中的数据争用。
相关问题
- 1. 如何获取ConcurrentHashMap的tailMap?
- 2. 获取视图中的最新表格
- 3. 如何获取最新的获取最近的7个条目
- 4. 如何获取最新的YouTube视频在Laravel
- 5. SQL GROUP BY:获取索引视图的最近更新记录
- 6. 如何获取Facebook的最新评论?
- 7. 如何获取最新的RMP数据?
- 8. 如何获取最新的数据?
- 9. 如何获取最新的RStudio版本
- 10. 的Sharepoint:试图获取最新的ID
- 11. 获取新添加项目的视图
- 12. 如何获取MySQL视图的列表?
- 13. 如何获取视图的大小?
- 14. 如何获取ListView项目的视图?
- 15. 如何获取视图的唯一ID
- 16. 如何获取Activity的内容视图?
- 17. 如何获取新值到列表视图的顶部位置
- 18. 如何获取ReativeCommand以获取最新的CanExecute值?
- 19. 如何从pubmed获取最新论文
- 20. 如何从Twitter获取最新推文?
- 21. 如何从Outlook获取最新消息
- 22. 如何从MySQL获取最新记录?
- 23. 如何获取复杂ListView行视图中的视图?
- 24. 如何获取视图外部的视图模型
- 25. 如何在列表视图中获取视图的ID
- 26. Youtube API获取最新上传缩图
- 27. AWS CLI:ECR列表图像,获取最新
- 28. 如何通过adb从Android设备获取最新截图?
- 29. 获取树型视图上新建项
- 30. 如何从资源中获取视图?
声明字段'volatile'不是你想要的,因为你并没有修改字段值本身。查询地图会给出最新的结果。 – oldrinb 2012-08-17 07:26:32
正确,我认为这也适用于AtomicReference。引用不是线程本地对所引用的东西没有影响,在这种情况下是地图。 – MilesHampson 2012-08-17 09:40:48
是正确的,因为该字段的值永远不会改变,并且集合的所有内存一致性都是由'ConcurrentHashMap'内部完成的。 – oldrinb 2012-08-17 18:39:22