1. ConcurrentHashMap原子操作入门指南
第一次接触ConcurrentHashMap的原子操作方法时,我正面临一个棘手的生产问题:用户会话系统在高并发下频繁出现重复创建。当时用传统的synchronized方案虽然解决了问题,但性能直线下降。直到发现了computeIfAbsent这个方法,才真正体会到什么叫"优雅的并发控制"。
ConcurrentHashMap作为Java并发包中的明星类,它的特别之处在于通过分段锁实现了高效的线程安全。但很多人不知道,真正让它大放异彩的是Java 8引入的三个原子操作方法:
- computeIfAbsent:当键不存在时自动创建值
- computeIfPresent:当键存在时自动更新值
- putIfAbsent:仅在键不存在时插入值
这三个方法的神奇之处在于它们把"检查-操作"这个原本需要加锁的复合动作,变成了一个原子操作。想象一下银行转账场景:检查余额和扣款这两个操作必须作为一个整体执行,否则就会出现并发问题。这些方法正是解决了类似的原子性问题。
2. computeIfAbsent深度解析
2.1 方法原理与使用场景
computeIfAbsent是我最常用的方法,它的签名很简单:
V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
但它的威力可不小。来看个真实案例:我们需要为每个用户维护一个独立的计数器。传统做法需要这样写:
ConcurrentHashMap<String, AtomicInteger> counters = new ConcurrentHashMap<>();
public void increment(String userId) {
AtomicInteger counter = counters.get(userId);
if (counter == null) {
counter = new AtomicInteger(0);
AtomicInteger existing = counters.putIfAbsent(userId, counter);
if (existing != null) {
counter = existing;
}
}
counter.incrementAndGet();
}
而用computeIfAbsent可以简化为:
public void increment(String userId) {


719

被折叠的 条评论
为什么被折叠?



