一、前言
多个线程访问共享变量,会出现一个线程修改变量值后,其他线程看不到最新值的情况,给共享变量加上volatile关键字,能解决这一问题。
二、代码
package com.zjl.study.多线程.volatile关键字;
/**
* Created by zjl 2022/5/29
**/
public class 多线程下变量不可见性问题 {
public static void main(String[] args) {
// 1、启动子线程,将线程中的flag值改为true
VolatileThread thread = new VolatileThread();
thread.start();
// 2、主线程
while (true) {
if (thread.isFlag()) {
System.out.println("主线程执行,此时flag已经改为true!!!!");
}
}
}
}
class VolatileThread extends Thread {
// 加volatile关键字
private volatile boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 线程中修改变量值
flag = true;
System.out.println("子线程将flag值变为true");
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}
三、运行结果:我们可以看出主线程读取到了子线程变更flag为true值后的最新值,执行了输出语句。
四、原因
1、volatile关键字修饰的变量可以在多线程并发修改下,实现线程间变量的可见性。
2、一旦一个线程修改了volatile关键字修饰的变量,另一个线程可以立即取到最新值。