查看原文
其他

面试中,关于volatile的四连问

小蒋学 面试专栏 2021-08-29

 本篇是1000期面试系列文章的第54,持续更新中.....欢迎关注“面试专栏”。

面试官:说说你对volatile的理解

通常回答:被volatile修饰的变量能保证器顺序性和可见性,不保证i++之类的原子性。


面试官继续问:能说说顺序性和可见性吗?


顺序性

  • 对一个volatile变量的写操作先行发生于后面对这个变量的读操作。“后面”指时间上的先后顺序

可见性

  • 当写一个 volatile 变量时,JMM 会把该线程对应的工作内存中的共享变量刷新到主内存。

  • 当读一个 volatile 变量时,JMM 会把该线程对应的工作内存置为无效,线程接下来将从主内存中读取共享变量。

volatile相比于synchronized/Lock是非常轻量级,但是使用场景是有限制的:

  • 对变量的写入操作不依赖于其当前值,即仅仅是读取和单纯的写入,比如操作完成、中断或者状态之类的标志

  • 禁止对volatile变量操作指令的重排序


面试官继续问:知道volatile的实现原理吗?


实现原理

volatile底层是通过cpu提供的内存屏障指令来实现的。硬件层的内存屏障分为两种:Load Barrier 和 Store Barrier即读屏障和写屏障。


面试官继续问:内存屏障起到了什么作用?


内存屏障有两个作用:

  • 阻止屏障两侧的指令重排序

  • 强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效

    : . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存