目录
一.volatile 能保证内存可见性
1、volatile修饰的变量,能够保证“内存可见性”
代码在写入volatile修饰的变量的时候:
- 改变线程工作内存中volatile变量副本的值;
- 将改变后的副本的值从工作内存刷新到主内存;
代码在读取volatile修饰的变量的时候:
- 从主内存中读取volatile变量的最新值到线程的工作内存中;
- 从工作内存中volatile变量的副本;
2、演示实例
以下代码创建了两个线程,线程thread01一直在运行,因为isQuit静态变量等于0,但是thread02线程可以修改静态变量isQuit的值。按道理在thread02线程修改变量的值后,thread01线程就会停止运行,但是运行代码后,修改完变量,thread01线程并没有停止运行。原因是thread02线程在修改完isQuit变量的值后,存储在线程的工作内存中,并没有刷新到主内存中,所以thread01线程并没有读取到修改后的变量值,一直在运行。
public class Volatile {
private static int isQuit=0;
public static void main(String[] args) {
Thread thread01 = new Thread(()->{
while (isQuit==0){
//循环啥也没有执行
//意味着一秒钟就会执行很多次
}
System.out.println("thread01执行完毕...");
});
Thread thread02 = new Thread(()->{
System.out.print("请输入isQuit的值:");
Scanner scanner = new Scanner(System.in);
isQuit = scanner.nextInt();
});
thread01.start();
thread02.start();
}
}
为了避免上述情况的发生,保证变量的内存可见性,引入volatile关键字。
private volatile static int isQuit=0;//volatile关键字让变量isQuit的内存变成可见性的
volatile 不保证原子性