volatile了解参考:
https://www.cnblogs.com/dolphin0520/p/3920373.html
https://blog.csdn.net/v123411739/article/details/79438066
https://www.cnblogs.com/xrq730/p/7048693.html
对其中可见性功能做验证
public class DemoController {
public boolean isShutdown;
public boolean getShutdown () {
return isShutdown;
}
public void shutdown () {
isShutdown = true;
}
public class ReaderThread extends Thread{
@Override
public void run() {
try {
System.out.println("开始循环");
while(!isShutdown){
}
System.out.println("循环结束");
}catch (Exception e){
e.printStackTrace();
}
}
}
public class WatchThread extends Thread{
@Override
public void run() {
try {
shutdown();
}catch (Exception e){
}
}
}
public static void main(String[] args) {
try {
DemoController demoController = new DemoController();
demoController.new ReaderThread().start();
//让线程沉睡一秒,确保另一个线程进来时,此线程已经进入循环
Thread.sleep(1000);
demoController.new WatchThread().start();
//此处让线程沉睡疫苗,确保w'htchThread中shotDown方法对变量的修改同步到主内存中
Thread.sleep(1000);
//打印变量的值
System.out.println("isShutdown---"+demoController.getShutdown());
}catch (Exception e){
e.printStackTrace();
}
}
}
这时启动程序 程序进入死循环,无法打印出 循环结束
此时变量isShutdown其实已经被修改了,也可能已经同步到主存中去了,但是线程 readerThread没有获取到最新的变量值;依然在死循环中
将 isShutdown 变量使用volatile关键字修饰后
public volatile boolean isShutdown;
再次执行程序;程序结束,打印出循环结束
输出结果如下
可以通过此次验证,证明volatile修饰的变量在多个线程间具有可见性;
WhtchThread修改变量为true后,更新到主存中,volatile关键之会使其它线程中的此变量缓存失效,重新去主存中获取最新变量值。因此就保证了 可见性;
但是并不能保证原子性;