Java 线程可见性

描述

当主线程将变量改变之后,另一个线程一直无法获取到此变量的最新值,这种情况称为可见性问题。

题目

请使用编程案例实现线程可见性问题。

题目解决思路

  1. 定义一个静态变量,初始值为 false。
  2. 创建一个线程,在线程中获取该静态变量的值,当变量为 true 时跳出循环。
  3. 主线程中改变变量值为 true。

代码具体实现

public class Test { private static boolean stop = false; public static void main(String[] args) throws InterruptedException { System.out.println("嗨客网(www.haicoder.net)\n"); new Thread(new Runnable() { @Override public void run() { while (!stop) { } System.out.println("循环结束,stop 为:" + stop); } }).start(); System.out.println("main 线程启动"); Thread.sleep(1000); stop = true; System.out.println("main 线程设置 stop 为:" + stop); } }

运行结果如下图:

06_java 线程可见性.png

以上案例发现,即使当变量 stop 为 true 时,子线程也不会停止,此处可以发现多线程存在可见性的安全问题。