其他
面试中,关于volatile的四连问
本篇是1000期面试系列文章的第54期,持续更新中.....欢迎关注“面试专栏”。
面试官:说说你对volatile的理解
通常回答:被volatile修饰的变量能保证器顺序性和可见性,不保证i++之类的原子性。
面试官继续问:能说说顺序性和可见性吗?
顺序性
对一个volatile变量的写操作先行发生于后面对这个变量的读操作。“后面”指时间上的先后顺序
可见性
当写一个 volatile 变量时,JMM 会把该线程对应的工作内存中的共享变量刷新到主内存。
当读一个 volatile 变量时,JMM 会把该线程对应的工作内存置为无效,线程接下来将从主内存中读取共享变量。
volatile相比于synchronized/Lock是非常轻量级,但是使用场景是有限制的:
对变量的写入操作不依赖于其当前值,即仅仅是读取和单纯的写入,比如操作完成、中断或者状态之类的标志
禁止对volatile变量操作指令的重排序
面试官继续问:知道volatile的实现原理吗?
实现原理
volatile底层是通过cpu提供的内存屏障指令来实现的。硬件层的内存屏障分为两种:Load Barrier 和 Store Barrier即读屏障和写屏障。
面试官继续问:内存屏障起到了什么作用?
内存屏障有两个作用:
阻止屏障两侧的指令重排序
强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效