手撕面试官之volatile的作用

本文深入探讨volatile关键字在多线程中的作用,包括禁用缓存的实现、防止指令重排的原理,以及如何解决由缓存行引发的伪共享问题。虽然volatile能确保可见性和有序性,但无法保证原子性,因此并不完全线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

术语

术语 描述
内存屏障 一组处理器指令,用于实现对内存操作顺序的限制
缓存行 cpu操作缓存的最小单位
伪共享 在多个线程同时读写同一个【缓存行】上的不同数据时,尽管这些变量之间没有任何关系,但是在多线程之间仍然需要同步,从而导致性能下降

volatile-禁用缓存

volatile禁用缓存并不是说真正的不缓存,而是让缓存无效来保证可见性。这里我么看下在x86处理器下通过工具获取JIT编译器生成的汇编指令。

1 priavete volatile Singleton instance;
...
2 instance = new Singleton();

第二行汇编指令为:

0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);

因为volatile的关系,多了个lock指令,lock指令会让处理器行为发生变化:
1,将处理器缓存行的数据写回到系统内存。
2,这个写回到内存的操作一旦发生,就会导致其他CPU里的该数据的缓存无效。
在《别问我多线程为啥有bug了》里面我介绍了可见性导致的线程问题,而lock导致的这两个行为就恰好解决了可见性的问题。具体可以结合链接中的图示研究下。

volatile-禁止指令重排

在《

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值