发布网友 发布时间:2022-06-02 14:50
共1个回答
热心网友 时间:2023-11-04 11:51
Java中ConcurrentHashMapputifAbsent方法的例子很多时候我们希望在元素不存在时插入元素,我们一般会像下面那样写代码synchronized(map){if(map.get(key)==null){returnmap.put(key,value);}else{returnmap.get(key);}}上面这段代码在HashMap和HashTable中是好用的,但在CHM中是有出错的风险的。这是因为CHM在put操作时并没有对整个Map加锁,所以一个线程正在put(k,v)的时候,另一个线程调用get(k)会得到null,这就会造成一个线程put的值会被另一个线程put的值所覆盖。当然,你可以将代码封装到synchronized代码块中,这样虽然线程安全了,但会使你的代码变成了单线程。CHM提供的putIfAbsent(key,value)方法原子性的实现了同样的功能,同时避免了上面的线程竞争的风险。