1.volatile是什么?
volatile是java虚拟机提供的轻量级的同步机制,具有如下特性:
a.保证可见性
b.不保证原子性
c.禁止指令重排
2.JMM内存模型?
JMM——https://www.cnblogs.com/zhouxuezheng/p/14950302.html
3.volatile的可见性代码验证:
主线程中判断资源类Cache中的变量a的值是否为0,如果为0则一直死循环。新开的线程A会在2秒钟后去改变Cache中a的值,但是主线程不能及时获取到a的最新值从而一直死循环,程序并不会在2秒钟结束。即线程A中对Cache中a的修改对main线程而言不可见 。如果在变量a上添加volatile关键字,程序就可在2秒后就可正常退出。注意:如果在while代码块中有System.out.println();程序也会在2秒后正常退出,这是因为System.out.println()方法底层有synchronized关键字,这会导致main线程强制获取主存中的数据。
class Cache{ int a = 0; public void setA() { a = 2; } } public class VolatileDemo { public static void main(String[] args) { Cache cache = new Cache(); new Thread(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) {} cache.setA(); }, "线程A").start(); while (cache.a == 0) { } } }