Java里如何实现线程安全的计数累加器_计数累加器线程安全处理技巧说明

线程安全计数可通过AtomicInteger、synchronized或LongAdder实现,AtomicInteger适合一般高频自增,synchronized适用于逻辑复杂场景,LongAdder在高并发下性能更优,避免使用普通int变量防止线程安全问题。

在多线程环境下,实现一个线程安全的计数累加器是常见需求,比如统计请求次数、生成唯一ID等。Java 提供了多种方式来保证计数操作的原子性和可见性,避免竞态条件和数据不一致问题。

使用 AtomicInteger 实现线程安全计数

AtomicInteger 是 java.util.concurrent.atomic 包中的类,基于 CAS(Compare-And-Swap)机制实现无锁并发控制,性能高且使用简单。

说明: 它的 incrementAndGet()、getAndIncrement() 等方法都是原子操作,适合高频自增场景。

示例代码:

import java.util.concurrent.atomic.AtomicInteger;

public class SafeCounter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet(); // 原子自增
    }

    public int getCount() {
        return count.get();
    }
}

使用 synchronized 关键字保护共享变量

通过 synchronized 方法或代码块,确保同一时刻只有一个线程能执行计数逻辑。

说明: 虽然加锁会带来一定性能开销,但在逻辑复杂或需同步多个操作时仍很实用。

示例代码:

public class SyncCounter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    

public synchronized int getCount() { return count; } }

使用 LongAdder 提升高并发性能

LongAdder 是 JDK 8 引入的类,专为高并发累加设计,比 AtomicInteger 在竞争激烈时性能更好。

说明: 它采用分段累加策略,每个线程在自己所属的单元上更新,最终通过 sum() 汇总结果。

示例代码:

import java.util.concurrent.atomic.LongAdder;

public class HighPerformanceCounter {
    private LongAdder counter = new LongAdder();

    public void increment() {
        counter.increment();
    }

    public long getCount() {
        return counter.sum();
    }
}

基本上就这些。选择哪种方式取决于实际场景:若并发不高,synchronized 最直观;一般情况用 AtomicInteger;高并发写场景推荐 LongAdder。关键是避免直接使用普通 int 变量做自增操作,那会导致线程安全问题。