返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #57526同步于 2017/9/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
使用concurrentHashMap会有什么问题吗
ywg557
2017/9/17镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
任意的组合操作,不能保证一致性*3
A线程读完发现value为null,然后让出,B线程执行,发现value也为null,这时两个线程都会执行put(key,1),结果key就是1了
再举个例子
map.put(1,1)//@1
int a=map.get(1)
map.put(1,2)//@2
int b=map.get(1)
a==b?true:false
如果是单线程,返回肯定是false,那多线程呢?
当A执行完@1,让出,B执行到@2,让出,A再执行a=map.get(1)得到2,再往下b还是2,于是返回true了
get it ! 谢谢指点
【 在 kulayami 的大作中提到: 】
: 再举个例子
: map.put(1,1)//@1
: int a=map.get(1)
: ...................
感觉上应该是任意原子性操作的组合起来的操作就不是原子操作了,改成atomicinteger也不能解决书上例子的问题的
【 在 ml3615556 的大作中提到: 】
: 本质上,是对value的并发修改。所以,让value变成原子型数据结构就好,例如atomicinteger
: 通过『我邮2.0』发布
额,是我疏忽了。[ema1]
确实不能解决初始化的时候可能出现的并发问题。
但是可以解决并发修改value的问题,让两个原子操作组合也是原子的。
这两个原子操作的组合并不是串联关系,所以你的结论可能不太适合。
【 在 cc19931002 (啦啦) 的大作中提到: 】
: 感觉上应该是任意原子性操作的组合起来的操作就不是原子操作了,改成atomicinteger也不能解决书上例子的问题的
通过『我邮2.0』发布
那你的意思是我把ConcurrentHashMap变成<String,AtomicInteger>这样,然后那个add方法就不会出现问题吗?
【 在 ml3615556 的大作中提到: 】
: 额,是我疏忽了。
: 确实不能解决初始化的时候可能出现的并发问题。
: 但是可以解决并发修改value的问题,让两个原子操作组合也是原子的。
: ...................