You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AtomicInteger是否线程安全?下述代码输出是确定还是不确定的?

关于AtomicInteger线程安全与输出结果的疑问

以下是测试代码:

import java.util.concurrent.atomic.AtomicInteger;

class Counter implements Runnable {
    private static AtomicInteger i = new AtomicInteger(3);

    public void run() {
        System.out.print(i.getAndDecrement());
    }
}

public class Test {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Counter());
        Thread t2 = new Thread(new Counter());
        Thread t3 = new Thread(new Counter());
        Thread[] threads = {t1, t2, t3};
        for(Thread thread : threads) {
            thread.start();
        }
    }
}

我多次运行这段代码,输出始终为321,但不确定是否会出现其他输出,同时想确认AtomicInteger是否线程安全。


解答

1. 是否会出现其他输出?

会的。你之前一直得到321只是线程调度的巧合,实际上输出顺序是不确定的,原因如下:

  • i.getAndDecrement()是原子操作,能保证三个线程分别拿到唯一的数值3、2、1,不会出现重复或错误;
  • 但System.out.print()不是原子操作,每个线程拿到数值后,执行打印的时机由线程调度器决定。比如可能出现线程2先拿到2,但线程1的打印动作晚于线程2完成,最终输出可能是312、231等任意组合。

2. AtomicInteger是否线程安全?

是的,AtomicInteger是Java提供的线程安全原子类。它基于CAS(比较并交换)机制实现无锁的线程安全,所有涉及数值修改的核心方法(如getAndDecrement()、incrementAndGet())都是原子性的,不会出现多线程环境下的竞态条件问题。在你的代码中,三个线程调用getAndDecrement()时,能确保每个操作独立且正确,不会出现数值混乱。


内容的提问来源于stack exchange,提问作者Asitha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:59:56