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
相关产品推荐
相关产品推荐

