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用作只写内存时才是安全的,这是一种牵强的场景。当您使用不同的线程安全机制来确保所有更新在开始读取映射之前都已完成时,它可能会起作用,但您的用例似乎有所不同。
这篇关于并发散列映射中值的原子更新-如何?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:并发散列映射中值的原子更新-如何?
基础教程推荐
猜你喜欢
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01