JAVA线程的可见性问题
问题描述:当主线程将变量改变之后,另一个线程一直无法获取到此变量的最新值,这种情况称为可见性问题。
用代码呈现可见性问题(思路步骤):
- 定义一个静态变量,初始值为 false。
- 创建一个线程,在线程中获取该静态变量的值,当变量为 true 时跳出循环。
- 主线程中改变变量值为 true。
用代码呈现可见性问题(具体代码):
public class Test {
private static boolean stop = false; //静态变量stop初始值为false
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (!stop) {
}
System.out.println("循环结束,stop 为:" + stop);
} //创建的这个线程中,当变量是stop为 true 时跳出循环。
}).start();
System.out.println("main 线程启动");//主线程启动
Thread.sleep(1000);
stop = true;//主线程中改变变量值为 true
System.out.println("main 线程设置 stop 为:" + stop);
}
}
运行结果如下:
即使当变量 stop 为 true 时,子线程也不会停止,此处可以发现多线程存在可见性的安全问题。