V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Georgedoe  ›  全部回复第 3 页 / 共 3 页
回复总数  42
1  2  3  
2022-05-20 16:50:23 +08:00
回复了 agzou 创建的主题 Java 请教一个 ConcurrentHashMap 问题
在你代码里加了点 log , 这是输出 , 很显然有问题

public long nextId(String key) {
// 虽然采用了并发安全的容器,但是当 contains 语句通过后,有可能出现多线程先后 put,AtomicLong 值有可能给覆盖?
if (!map.containsKey(key)) {
AtomicLong atomicLong = new AtomicLong(0);
System.out.println("put twice");
map.put(key, atomicLong);
long l = atomicLong.incrementAndGet();
System.out.println(l);
return l;
}
return map.get(key).incrementAndGet();
}


put twice
put twice
put twice
1
1
2
2022-05-20 16:40:49 +08:00
回复了 agzou 创建的主题 Java 请教一个 ConcurrentHashMap 问题
同一个 key 有可能会被 put 多次 , 某个 key 的 contains 和 put 不是原子操作 , 可以去看看 go 的 singleflight 的实现 , 保证一次只有一个线程执行了 set (put) 操作
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1861 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 11ms · UTC 16:42 · PVG 00:42 · LAX 08:42 · JFK 11:42
Developed with CodeLauncher
♥ Do have faith in what you're doing.