Java中使用Atomic时的线程自旋结束原因?
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个回答

test
2024-06-23
自旋并不是卡死,只是在不断的尝试。一次失败并不意味着以后就一定会一直失败。否则重复尝试就没有意义了。
尝试成功了自然就结束了。
回复

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