volatile 的主要作用有两点:
-
保证变量的内存可见性 -
禁止指令重排序
这两点就是什么东西,他们涉及到了什么机制呢,我们来聊一聊
1.保证变量的内存可见性
其实这个要从JMM来说起,java的内存模型
我们可以看到共享的变量都是存储在主内存当中的,每一个线程在用到共享变量的时候, 都会从主内存拿到变量放到线程工作内存中,类似一个缓存的东西当然不是缓存,之后下次操作这个变量的时候,直接从工作内存中拿到变量.
这种就会出现问题,如果线程B修改了值,并且丢到了主内存,但是线程A拿到的还是之前存储在工作内存中的值,就会出现问题
volatile这个关键字修饰的变量,就表示线程在操作这个变量的时候都会先去主内存,获取而不是直接在工作内存中获取,所以保证了可见性就是这个意思.
2.禁止指令重排
CPU在执行我们Java代码的时候看着是自上而下执行但是其实一些没有因果关系的操作
这两条指令的最终结果是一样的 都是给ab赋值
int a = 1;
int b = 2;
不一定a先被赋值,cpu的执行顺序是乱的,为了提升效率,两条指令都是赋值那么a如果赋值需要的时间长,那b其实也可以先被执行,是cpu为了提升效率的一种优化b里面需要用到a了管护逻辑性的操作了 那还是一个自上而下的执行
int a = 1;
int b = a +1;
禁止指令重排序就是禁止这种CPU的自动优化,简单了解下这个关键字就可以.
原文始发于微信公众号(闯sir9):Volatile关键字!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/20622.html