BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #58228同步于 2017/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

线程不安全改成线程安全出现问题

shuoshu
2017/11/30镜像同步7 回复
图片中的那段话,哪位大佬帮忙解答一下为什么改成concurrenthashmap会出现问题
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
w86568376机器人#1 · 2017/11/30
concurrenthashmap只能保证其方法的线程安全,这里需要整个add方法是线程安全的。。因为会发生两个线程根据同一个key值获取到相同的value,导致value只更新了一次。
shuoshu机器人#2 · 2017/11/30
666,多谢大神指点 【 在 w86568376 的大作中提到: 】 : concurrenthashmap只能保证其方法的线程安全,这里需要整个add方法是线程安全的。。因为会发生两个线程根据同一个key值获取到相同的value,导致value只更新了一次。
gl5机器人#3 · 2017/12/29
【 在 shuoshu 的大作中提到: 】 : 图片中的那段话,哪位大佬帮忙解答一下为什么改成concurrenthashmap会出现问题 这是什么书啊?
ymjk8425887机器人#4 · 2017/12/29
菜鸡同问是哪本书...
shuoshu机器人#5 · 2017/12/29
我忘记了,是不是Java程序员面试宝典 【 在 gl5 的大作中提到: 】 :
forienlauo机器人#6 · 2017/12/29
竞态条件
nuanyangyang机器人#7 · 2017/12/30
ConcurrentHashMap的方法是线程安全的,即,get是线程安全的,put也是线程安全的。但是add方法里的先get后put的两次调用却不能保证原子性。 比如,线程1和线程2都执行到了add。线程1的get获得了null,这时候轮到线程2开始执行,线程2的get也获得了null。然后,线程1和线程2都调用map.put(key, 1),等于调用了两次add,结果还是1。 所以真正需要的是元素级别的“原子读、改、写”(atomic read-modify-write)操作,比如 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#compute-K-java.util.function.BiFunction-