Hello! 欢迎来到小浪资源网!


子线程中volatile变量无法中断while循环?如何解决?


子线程中volatile变量无法中断while循环?如何解决?

线程while 循环无法中断的原因及其解决方法

本例中,我们创建了一个子线程来修改条件变量 condition 的值为 false,目的是使 run 方法中的 while 循环终止。然而,我们实际观察到 while 循环持续运行,不会打印“退出”信息。

其原因在于 volatile 关键字并不能保证子线程对 condition 的修改在主线程立即可见。当子线程修改 condition 的值时,主线程依然使用该变量的旧值。因此,while 循环仍然以 true 作为条件而持续运行。

要解决这个问题,我们可以将 run 方法本身放到子线程中,确保修改 condition 的操作和 while 循环在同一个线程中执行。修改后的代码如下:

public class VisibilityDemo {     private static volatile boolean condition = true;      public static void main(String[] args) {         new Thread(() -> {             while (condition) {                 // do something                 System.out.println("...");             }             System.out.println("退出");         }).start();         new Thread(() -> {             condition = false;         }).start();     } }

相关阅读