Java中使用Atomic时的线程自旋结束原因?

作者站长头像
站长
· 阅读数 10

java中使用atomic的时候,由于cas机制,获取到的实际值和预期值不一致,会进入自旋状态,也就是卡死状态,但实际开发中,代码却可以正常进入下次循环,为什么不会因为自旋而永远卡死在本次循环呢?

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicTest {
    static volatile AtomicInteger num = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        //创建10个线程并启动
        for (int i = 1; i <= 10; i++) {
            new Thread() {
                @Override
                public void run() {
                    // 每个线程内部循环1万次,每次num自增1
                    for (int j = 0; j < 10000; j++) {
                        num.incrementAndGet();//进行cas操作,这时候可能会产生cas自旋,产生自旋后为啥不会卡死,仍然可以结束本次循环
                    }
                }
            }.start();
        }
        Thread.sleep(3000);//保证获取到的num值为所有线程执行完毕后最新的值
        System.out.println("最终获取到的num=" + num.get());
    }
}
回复
1个回答
avatar
test
2024-06-23

自旋并不是卡死,只是在不断的尝试。一次失败并不意味着以后就一定会一直失败。否则重复尝试就没有意义了。

尝试成功了自然就结束了。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容