更多面试题请看这里:https://interview.raoyunsoft.com/

不是线程安全的++ 操作符(自增操作)在多线程环境下存在竞态条件(Race Condition),因为它本质上是复合操作,包含三个独立步骤:

  1. 读取变量的当前值
  2. 增加该值
  3. 写回新值到内存

当多个线程同时执行 ++ 操作时,这些步骤可能交叉执行,导致最终结果不符合预期。


❌ 非线程安全示例
public class Counter {
    private int count = 0;
    
    public void increment() {
        count++; // 非线程安全
    }
    
    public int getCount() {
        return count;
    }
}

若两个线程同时调用 increment(),可能出现以下情况:

threadA count threadB 读取值0 读取值0(此时threadA尚未写回) 计算0+1=1 计算0+1=1 写回1 写回1(覆盖了threadA的结果) threadA count threadB

最终 count 的值可能是 1 而非预期的 2


✅ 线程安全解决方案
  1. 使用 synchronized 同步
public synchronized void increment() {
    count++;
}
  1. 使用 AtomicInteger(推荐)
private AtomicInteger count = new AtomicInteger(0);

public void increment() {
    count.incrementAndGet(); // 原子操作
}

AtomicInteger 通过 CAS(Compare-And-Swap)机制保证原子性,无需锁竞争。


关键结论
方案 线程安全 性能 适用场景
++ 操作符 ❌ 不安全 单线程环境
synchronized ✅ 安全 中低 简单同步
AtomicInteger ✅ 安全 高并发计数

💡 实际开发中,优先选择 AtomicInteger 等原子类,避免显式锁带来的性能开销。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐