Vilatile底层逻辑总结
创始人
2024-04-14 16:01:20
0

#### 增加volatile 使用JIT优化的时候 禁止出现语句重排

  #### volatile是Java虚拟机提供的轻量级同步机制。

  - 保证可见性

  - 不保证原子性(整体流程成功  整体流程失败)如果要保证原子性-加 `synchronized` 或者直接使用 `Automic` 原子类

  - 禁止指令重排(保证有序性)

### Volatile内存屏蔽—防止指令重排

计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排,一般分为以下 3 种:

  #### 原理:

  volatile 可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在 JVM 底层是基于内存屏障实现的。

  - 当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到 CPU 缓存中。如果计算机有多个CPU,每个线程可能在不同的 CPU 上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。

  - 而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步,所以就不会有可见性问题。

    - 对 volatile 变量进行写操作时,会在写操作后加一条 store 屏障指令,将工作内存中的共享变量刷新回主内存;

    - 对 volatile 变量进行读操作时,会在写操作后加一条 load 屏障指令,从主内存中读取共享变量;

  通过 hsdis 工具获取 JIT 编译器生成的汇编指令来看看对 volatile 进行写操作CPU会做什么事情,还是用上边的单例模式,可以看到

  有 volatile 修饰的共享变量进行写操作时会多出第二行汇编代码,该句代码的意思是**对原值加零**,其中相加指令addl前有 **lock** 修饰。通过查IA-32架构软件开发者手册可知,lock前缀的指令在多核处理器下会引发两件事情:

  - 将当前处理器缓存行的数据写回到系统内存(地址改变)

  - 这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效

  **正是 lock 实现了 volatile 的「防止指令重排」「内存可见」的特性**

总结

使用场景

    非原子性场景:直接可以采用-无忧虑

    原子性场景:配合synchronized或者Automic

 性能方面:

        读操作性能损耗忽略

        写操作比`synchronized`要优秀

相关内容

热门资讯

庆阳市烟花爆竹燃放管理条例 庆阳市烟花爆竹燃放管理条例 (2019年11月20日庆阳市第四届人民代表大会常务委员会第二十四次会议...
ST信通(600289)披露涉... 截至2025年12月31日收盘,ST信通(600289)报收于6.64元,较前一交易日下跌0.6%,...
国务院常务会议解读|国务院常务... 新华社北京12月31日电(记者戴小河)12月31日召开的国务院常务会议,审议通过《中华人民共和国药品...
华智数媒(300426)披露诉... 截至2025年12月31日收盘,华智数媒(300426)报收于7.72元,较前一交易日下跌0.39%...
73亿借款纠纷胜诉,上海银行又... 出品|达摩财经 上海银行与宝能系7年前的借款纠纷终于等来了一审判决。 12月29日,上海银行(601...
揭阳货币政策工具投放2025年... 2025年以来,人民银行揭阳市分行(以下简称“揭阳市分行”)积极落实上级行与揭阳市委、市政府各项决策...
深交所2026新年致辞:抓改革... 12月31日,深交所发布2026新年致辞。在致辞中,深交所表示,2026年,深交所将围绕防风险、强监...
国海证券:南京中院对金通灵证券... 国海证券12月31日公告,公司作为金通灵科技集团股份有限公司证券虚假陈述责任纠纷案的共同被告之一,收...
思创医惠涉嫌证券违法 已被移送... 12月31日,思创医惠(300078.SZ)发布公告称,公司收到杭州市公安局出具的《移送审查起诉告知...
政策创新显成效!深圳演艺新空间... 12月30日,深圳市演艺新空间发展工作会议召开。会议总结了年度发展成果,通报了2025年度认定与复核...