volatile


关于volatile的理解
作用:1.保证变量在内存中对线程的可见性,2.禁止指令重排
volatile保证变量在内存中对线程的可见性
volatile只保证可见性,不保证原子性

指令重排(在保证不影响结果的前提下,将某些代码乱序执行)

Java代码明明是从上往下依次执行,为什么会出现指令重排这个问题?
并发编程中,cpu自身和虚拟机为了提高执行效率,你写的代码顺序对于jvm来说,不一定是最优执行顺序,
jvm在编译后会对代码进行重排,在不影响结果的前提下,有些比较费内存的代码就得放后面,
效率高的代码就会放前面,这样就发生了指令重排,说白了,就是单纯的为了,提高整个栈帧的执行效

在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,
它需要满足以下两个条件: 在单线程环境下不能改变程序运行的结果;存在数据依赖关系的不允许重排序需要注意的是:
重排序不会影响单线程环境的执行结果,但是会破坏多线程的执行语义。

存在指令重排是cpu为了提高单线程的程序执行效率而作的优化,但是对于多线程环境来说,会出现线程安全问题,所以通过volatile来解决

posted @ 2022-02-08 15:49  JokerZM  阅读(50)  评论(0编辑  收藏  举报