java如何处理对存储在映射中的POJO的并发更新和读取
我计划使用最多由2个并发线程操作的CHM实现一个用于查找的简单内存缓存。一个线程使用迭代器迭代和更新CHM,第二个线程从映射中读取值
根据我的理解,我到目前为止所经历的CHM迭代器是故障安全的,这意味着迭代将发生在数据的快照上
因此,假设线程A从CHM中提取一个值,该值是使用键的POJO,并且它正在迭代/更新POJO。同时,ThreadB在同一个POJO上运行。那么,此时的预期行为是什么呢
- ThreadB会看到ThreadA正在进行的更新吗?我猜不是因为线程仍然在进行更新。<李>
- 如果是的话,请分享你的想法,那会怎样李>
- 如果没有,请建议有效的替代方法,如果你已经实施了李>
POJO有点像下面
Class Pojo{
private volatile long a;
private volatile long b;
....
public long getA() {
return this.a;
}
void setA(long a) {
this.a = a;
}
}
# 1 楼答案
# 2 楼答案
你不能这样做吗
CHM replace是原子的,在进行替换时,其他线程不会读取POJO的过时值
# 3 楼答案
这是不对的。每the documentation
[强调我的]
如果线程A正在变异一个POJO,而线程B正在检查同一个POJO,那么ConcurrentHashMap一点也不相关:两个线程如何获得POJO并不重要,只有POJO本身如何处理并发更新和读取
您还没有告诉我们关于POJO类的任何信息,但除非它经过精心设计,允许原子更新和读取,否则线程B有时会以不一致的状态查看POJO,线程a的一些读取,但不是全部读取