返回信息流图片中的那段话,哪位大佬帮忙解答一下为什么改成concurrenthashmap会出现问题
这是一条镜像帖。来源:北邮人论坛 / java / #58228同步于 2017/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
线程不安全改成线程安全出现问题
shuoshu
2017/11/30镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
concurrenthashmap只能保证其方法的线程安全,这里需要整个add方法是线程安全的。。因为会发生两个线程根据同一个key值获取到相同的value,导致value只更新了一次。
666,多谢大神指点
【 在 w86568376 的大作中提到: 】
: concurrenthashmap只能保证其方法的线程安全,这里需要整个add方法是线程安全的。。因为会发生两个线程根据同一个key值获取到相同的value,导致value只更新了一次。
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-