Java并发编程之Atomic原子操作

一、原子数组(Atomic*Array)

1. 核心功能

原子数组(如AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray)提供对数组元素的原子操作,支持无锁并发访问,避免对整个数组加锁。

示例场景:
  • 多线程并发修改数组不同元素。
  • 实现高性能无锁数据结构(如环形缓冲区)。

2. 代码示例:原子计数器数组

public class AtomicArrayDemo {
    private final AtomicIntegerArray counters = new AtomicIntegerArray(10); // 10个元素的原子数组

    // 线程安全地递增指定索引的计数器
    public void increment(int index) {
        counters.getAndIncrement(index); // 原子操作:index位置的元素+1
    }

    // 获取所有计数器的总和
    public int sum() {
        int sum = 0;
        for (int i = 0; i < counters.length(); i++) {
            sum += counters.get(i);
        }
        return sum;
    }
}

二、原子更新器(Atomic*FieldUpdater)

1. 核心功能

原子更新器(如AtomicIntegerFieldUpdaterAtomicReferenceFieldUpdater)允许直接对类的volatile字段进行原子更新,无需将字段包装为原子类,适合优化已有代码。

示例场景:
  • 修改第三方库中的volatile字段,避免创建AtomicReference实例。
  • 减少内存开销(直接操作对象字段,无需额外包装)。

2. 代码示例:无锁对象字段更新

public class FieldUpdaterDemo {
    // 目标类(字段必须为volatile)
    public static class Config {
        volatile String value;
    }

    // 创建原子更新器
    private static final AtomicReferenceFieldUpdater<Config, String> updater =
        AtomicReferenceFieldUpdater.newUpdater(Config.class, String.class, "value");

    public static void main(String[] args) {
        Config config = new Config();
        updater.compareAndSet(config, null, "NewValue"); // 原子更新value字段
        System.out.println(config.value); // 输出:NewValue
    }
}

三、原子累加器(LongAdder、LongAccumulator)

1. 核心功能

原子累加器通过分段锁减少竞争,在高并发场景下性能显著优于AtomicLong

  • LongAdder:专为累加操作优化(add()sum())。
  • LongAccumulator:支持自定义累加函数(如最大值、最小值)。
示例场景:
  • 高并发统计(如网站访问量计数)。
  • 实时聚合计算(如最小值、最大值)。

2. 代码示例:高并发计数器

public class AccumulatorDemo {
    private final LongAdder totalRequests = new LongAdder(); // 总请求数
    private final LongAccumulator maxLatency = 
        new LongAccumulator(Long::max, 0); // 最大延迟(初始值0)

    // 处理请求
    public void handleRequest(long latency) {
        totalRequests.increment();          // 累加请求数
        maxLatency.accumulate(latency);     // 更新最大延迟
    }

    // 获取统计数据
    public void printStats() {
        System.out.println("Total: " + totalRequests.sum());
        System.out.println("Max latency: " + maxLatency.get());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值