Atomic updates of values in concurrent hash map - how to?(并发散列映射中值的原子更新-如何?)
本文介绍了并发散列映射中值的原子更新-如何?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
任务是跟踪一些正在运行的进程。将该信息保存在内存中很好,因此我使用并发散列映射来存储该数据:
ConcurrentHashMap<String, ProcessMetaData> RUNNING_PROCESSES = new ConcurrentHashMap();
将新对象安全地放置到映射中是很好的,问题是这些进程的状态会发生变化,所以我必须不时地更新ProcessMetaData
。我将ProcessMetaData
设置为不可变的,并使用ConcurrentHashMap
的compute()
方法更新值,但现在的问题是ProcessMetaData
变得更复杂,保持它不变很难管理。问题是--只要我只更新原子方法中的ProcessMetaData
(根据javadoc)compute()
,对象可能是可变的,总体上仍然是线程安全的?我的假设正确吗?
推荐答案
只要您只访问传递给compute
的函数内的值,在该函数中所做的修改就是安全的。
然而,这是一个毫无意义的理论观点。将值存储到集合或映射中的目的是最终检索和使用它们。这就是问题的起点。
compute
方法返回结果值,就像get
返回当前存储值一样。一旦调用方开始使用该值,此使用可能与映射上的后续compute
操作并发。get
方法甚至可以在compute
操作正在进行时检索值。允许非阻塞检索操作是ConcurrentHashMap
的主要功能之一。因此,可能会发生各种争用情况。
compute
中已经存储的值只有在将map用作只写内存时才是安全的,这是一种牵强的场景。当您使用不同的线程安全机制来确保所有更新在开始读取映射之前都已完成时,它可能会起作用,但您的用例似乎有所不同。
这篇关于并发散列映射中值的原子更新-如何?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:并发散列映射中值的原子更新-如何?


猜你喜欢
- 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
- Eclipse 的最佳 XML 编辑器 2022-01-01
- 未找到/usr/local/lib 中的库 2022-01-01
- 如何指定 CORS 的响应标头? 2022-01-01
- GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
- 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
- 转换 ldap 日期 2022-01-01
- 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
- java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
- 获取数字的最后一位 2022-01-01