可见性问题的现象
代码演示
public class Test {
private static boolean flag = true;
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
System.out.println("flag为" + flag);
}
}.start();
while (true) {
if (flag == false) {
System.out.println("退出死循环");
break;
}
}
}
}
现象描述
我们先启动一个线程,在线程中将一个变量flag的值更改,而主线程却一直无法获得此变量的新值。
volatile关键字
- volatile是一个"变量修饰符",它只能修饰"成员变量",它能强制线程每次从主内存获取值,并能保证此变量不会被编译器优化。
- volatile能解决变量的可见性、有序性;
- volatile不能解决变量的原子性
代码演示
我们只需要在多线程共享的变量前加上volatile关键字即可。如下:
public class Test {
private static volatile boolean flag = true;
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
System.out.println("flag为" + flag);
}
}.start();
while (true) {
if (flag == false) {
System.out.println("退出死循环");
break;
}
}
}
}