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


子线程修改共享变量,主线程while循环为何无法中断?


子线程修改共享变量,主线程while循环为何无法中断?

线程为何无法中断 while 循环

问题描述:

给定如下代码:

public class visibilitydemo {     private static volatile boolean condition = true;      static void run() {         while (condition) {             // do something             system.out.println("...");         }         system.out.println("退出");     }      public static void main(string[] args) {         run();         new thread(() -> {             condition = false;         }).start();     } }

问题是,当子线程更新 condition 为 false 时,主线程中的 run 方法无法终止其 while 循环,导致代码持续打印 “…” 而无法输出 “退出”。

回答:

问题原因在于,子线程修改的 condition 值并不会立即对主线程可见。当子线程更新 condition 后,主线程可能仍未感知到这一更改,导致 run 方法中的 while 循环继续执行。

解决方法

最简单的解决方法是将 run 方法也放置在另一个线程中,而不是直接在 main 方法中调用它。通过将 run 放入线程,它将与子线程并发执行,因此子线程修改 condition 时,主线程可以及时感知到这一更改,从而导致 run 方法中的 while 循环终止。

修改后的代码如下:

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

相关阅读