当前位置: 首页 > 知识库问答 >
问题:

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

徐俊楚
2024-01-09

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个答案

濮冠宇
2024-01-09

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

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

 类似资料:
  • 问题内容: 看一下这段代码: 通常,到达的结尾时,程序会终止。但是在此示例中,程序将打印“ main of End”,然后继续运行,因为线程仍在运行。有没有一种方法可以使线程在结束时 自动 停止,而无需使用类似的东西? 问题答案: 您正在创建的线程是独立的,并且不依赖于主线程终止。您可以使用线程。 当没有其他线程在运行时,守护进程线程将由JVM终止,它也包括一个执行主线程。

  • 这个问题可以更好地表述为:如何在不阻塞的情况下检测InputStream中的EOF 我有一个java程序,它可以直接从System.in中获取输入(不使用扫描器),我也可以像任何程序一样直接将输入管道输入到java程序中。但是,当我将输入管道输入到程序中时,程序继续运行。这个想法是,如果输入被管道输入,就停止程序,但如果我们在等待用户输入,就保持程序运行。 编辑:无论出于什么原因,我花了大约2个小

  • 线程的结束 现有问题 当内核线程终止时,会发生什么?如果就按目前的实现,我们会发现线程所执行的函数末尾会触发 Exception::InstructionPageFault 而终止,其中访问的的地址 stval = 0。 这是因为内核线程在执行完 entry_point 所指向的函数后会返回到 ra 指向的地址,而我们没有为其赋初值(初值为 0)。此时,程序就会尝试跳转到 0x0 地址,而显然它是

  • 主要内容:1 atomic的概述,2 原子更新单个变量,2.1 基本原子类,2.2 带版本号的原子类,3 原子更新数组,3.1 重要属性,3.2 重要方法,4 原子更新字段属性,5 原子类的加强,6 atomic的总结基于JDK1.8详细介绍了JUC下面的atomic子包中的大部分原子类的底层源码实现,比如AtomicInteger、AtomicIntegerArray、AtomicStampedReference等原子类源码。最后还介绍了JDK1.8对原子类的增强,比如LongAdder和Lo

  • 我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,可以运行用户想要的时间,但最终会在用户发出停止命令时停止。然而,如果其中一个线程突然终止(例如,由于运行时异常),我想停止另一个线程。 现在,这两个线程都执行一个(因此,当我说“stop a thread”时,我的意思是对实例调用一个stop()方法),我想的是避免使用线程(thread类),并使用interface,然后将这两个Runn

  • 本文向大家介绍深入了解Java atomic原子类的使用方法和原理,包括了深入了解Java atomic原子类的使用方法和原理的使用技巧和注意事项,需要的朋友参考一下 在讲atomic原子类之前先看一个小例子: 最终的输出结果为100,可见这个程序是线程安全的。如果把AtomicInteger换成变量i的话,那最终结果就不确定了。 打开AtomicInteger的源码可以看到: volatile关