多线程有三大特性:原子性、可见性、有序性
volatile关键字可以保证多线程之间的可见性以及代码的有序性,今天就来证明一下volatile可以保证可见性
public class VolatileDemo1 {
private volatile static int INIT_VALUE = 0;
private final static int MAX_VALUE = 3;
public static void main(String[] args) {
new Thread(()->{
int localValue = INIT_VALUE;
while (localValue < MAX_VALUE){
if (localValue!= INIT_VALUE ){
System.out.println("LocalValue值为"+localValue);
localValue = INIT_VALUE;
}
}
},"READER").start();
new Thread(()->{
int localValue = INIT_VALUE;
while (localValue < MAX_VALUE){
try {
Thread.sleep(1_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("LocalValue值更新为"+localValue++);
INIT_VALUE = localValue;
}
},"UPDATE").start();
}
}
上面这段代码中**private volatile static int INIT_VALUE = 0;**有volatile关键字修饰,执行结果如下
LocalValue值更新为0
LocalValue值为0
LocalValue值更新为1
LocalValue值为1
LocalValue值更新为2
LocalValue值为2
可以看出来,UPDATE线程每更新一次INIT_VALUE的值,READER线程就会立马感知到,这就说明volatile关键字保证了线程之间数据的可见性
下面看一下如果 private static int INIT_VALUE = 0; 不带volatile关键字执行结果,直接卡死了
LocalValue值更新为0
LocalValue值更新为1
LocalValue值更新为2
可以看出来,UPDATE线程已经执行完了,只剩下一个READER线程,正因为READER线程没有感知到数据的变化,所以 while (localValue < MAX_VALUE) 这个条件一直成立,这就造成了死循环。