首页 > 系统相关 >关于Java的volatile关键字、内存屏障的思考

关于Java的volatile关键字、内存屏障的思考

时间:2022-11-03 00:34:04浏览次数:36  
标签:缓存 Java 屏障 指令 volatile 内存 CPU 前缀

  内存屏障就是一种屏障指令,在X86架构中,指的是加了“lock前缀”的汇编指令在执行时会让 CPU 或编译器在对内存进行操作的时候, 严格按照一定的顺序来执行。

  也就是说内存屏障保证了一下两点:第一点是 在内存屏障之前的指令和之后的指令不会由于CPU的指令优化而导致指令乱序执行;第二点是 在内存屏障之前的指令不会由于编译器指令重排序优化而导致指令分发到在多个核心或者多个处理器去乱序执行。
  而Java的volatile关键字也和内存屏障有关系。

  Java的volatile关键字有两个功能,其中的禁止指令重排序优化这个功能,实质是在生成的汇编指令cmpxchg之前加了lock前缀。(cmpxchg是x86架构下的比较并交换操作的实现,虽然在CPU层面cmpxchg是一个指令,但是在执行时会翻译成几条微码执行读操作和写操作,而lock前缀也是x86架构下才有的,目的就是为了保证指令的原子执行)
  加了lock前缀的指令在CPU执行时就相当于形成了内存屏障

  Lock前缀可以锁定缓存行并把CPU store缓冲区中的所有数据刷新到内存中(这里的刷到内存中,不是CPU的主动写入,而是触发缓存一致性协议,由缓存子系统来回写内存或者通过QPI总线同步其他cache中的副本,并且缓存一致性协议自动阻止缓存了相同内存区域的两个或多个处理器同时修改该区域中的数据)。所以这意味着所有之前的指令都已经执行完成,这样就形成了“禁止指令重排序”的效果。

标签:缓存,Java,屏障,指令,volatile,内存,CPU,前缀
From: https://www.cnblogs.com/bryantor/p/16853049.html

相关文章

  • Java反射
    一Java安全可以从反序列化漏洞开始说起,反序列化漏洞⼜可以从反射开始说起正是反射使得Java拥有了动态特性,对象可以通过反射获取他的类,类可以通过反射拿到所有⽅法(包括私......
  • 学习Java的第三天 运算符
    运算符算术运算符注意事项需要注意的是i++和++i的区别i++运行完这行代码后在进行自增或自减++i在运行这行前就进行自增或者自减运算结果的数据类型为参与运算的......
  • Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化
    承接上文:Java函数式编程:一、函数式接口,lambda表达式和方法引用这次来聊聊函数式编程中其他的几个比较重要的概念和技术,从而使得我们能更深刻的掌握Java中的函数式编程。......
  • 既然CPU有缓存一致性协议(MESI),为什么JMM还需要volatile关键字?
    缓存一致性协议是保证“硬件CPU的cache”和“硬件内存”之间数据的一致性,更详细说也就是缓存一致性协议是保证“物理计算机中的硬件CPUcache”和“物理计算机中的......
  • java生成pdf
    参考链接https://blog.csdn.net/weixin_39806100/article/details/86616041https://www.cnblogs.com/next-yrz/p/10134670.htmlhttps://www.likecs.com/show-306660785.......
  • java----GUI编程
    1packagecom.cilinmengye.HouseWork5;23importjavax.swing.*;4importjava.awt.*;5importjava.awt.event.ActionEvent;6importjava.awt.event.Actio......
  • java中string类的使用
    packagecom.te.jdkapi;/*字符串不可变。一经初始化就不会改变*/publicclassStudy_String{publicstaticvoidmain(String[]args){Stringa="1......
  • Java学习——10.02
     不得不说,Java真的很好上手,只不过搭建环境真的难。今天的话搞了一个喜欢的Java开发背景图,看着就心情愉悦。再加上今天idea学生认证下来,就很棒!    废话不多说进入正......
  • javascript - 练习题(若干)
    慢慢收集一些习题、考题练习1问:X,Y,Z分别是多少?varx=1,y=z=0;functionadd(n){returnn=n+1;}y=add(x);functionadd(n){returnn=n+3;}z=add(x);conso......
  • Java GUI编程(未完待续...)
    JavaGUIAWT1.组件和容器Frame弹出一个窗口packageuichuan;importjava.awt.*;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;pu......