volatile 可见性:退不出去的循环
volatile 可以保证变量的有序性和可见性
有一个共享变量 private static boolean run = false(共享变量会放到主存中),
当某个线程多次访问该变量次数达到某个阈值时,就会从高速缓存中获取该值,不会在从主存中获取,
可能会导致该值已经被修改了,但是拿到的不是被修改后的值,导致线程不能退出结束
因此需要用 volatile 来修饰这个共享变量,来让获取的值每次都是在主存中获取,就可以避免上述情况
volatile 适合多次获取 只有一处修改的情况下
别的情况 还是用synchronized来保证






对于有序性,指令加载代码的时候 可能会改变加载代码的顺序,导致结果不是自己想要的
如:

这个结果可能时 0 1 4 ,发生0的时候 时由于 num=2; ready=true 加载顺序变为 ready=true; num=2
所以可以在 boolean ready = false 前边加上 volatile ,
volatile 写屏障 、读屏障
volatile 保证在写入之前的操作指令顺序排列,写屏障
volatile 修饰的变量保证读之后的都是从主内存中读取变量值 读屏障
(为什么值在ready上边加呢,因为时保证ready的顺序不变就行)
浙公网安备 33010602011771号