gpt4 book ai didi

java - int 和 Integer 影响并发结果

转载 作者:行者123 更新时间:2023-11-30 01:46:19 25 4
gpt4 key购买 nike

有一个简单的代码中止并发。i 的类型从 int 变为 Integer ,程序运行方式不同。 它不会停止使用 int ,而是停止在 Integer 中。我还改变了一些其他方式。例如添加 printf 或用 True 替换 while 条件。然后它表现不正常

那么你可以尝试这些条件

  1. 不要更改任何内容,代码将永远运行

  2. 将 i 的类型从 int 更改为 Integer。程序将在几秒钟内结束

  3. 保持 i 的类型为 int ,并添加一个 System.out.println(String.valueOf(i)) 。这样程序将在 print 228273 后结束。该值将发生变化,例如 222889\226074 等

  4. 将 while 条件更改为 true,而不是 !stopRequested。那么程序将永远运行。i的类型不是决定

    import java.util.concurrent.TimeUnit;
    public class StopThread {
    private static boolean stopRequested;

    public static void main(String[] args) throws Exception {
    Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
    int i = 0;
    while (!stopRequested) {
    i++;
    //System.out.println(String.valueOf(i));
    }
    }
    });
    t.start();
    TimeUnit.SECONDS.sleep(1);
    stopRequested = true;
    }
    }

谁能告诉我原因吗?

最佳答案

原因是,如果没有适当的同步,Java 内存模型无法保证您在一个线程中编写的内容对另一个线程可见。

您的 stopRequested 变量应该是 volatile 的,或者应该在同步块(synchronized block)内访问它,或者它应该是 AtomicBoolean

参见https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

关于java - int 和 Integer 影响并发结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57831462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com