Skip to content

面试速答(先看这里)

**一句话结论:**volatile除了可以保证数据的可见性之外,还有一个强大的功能,那就是他可以禁止指令重排优化等。

60秒标准回答:

对于volatile变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中

所以,如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议,也会把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile在并发编程中,其值在多个缓存中是可见的

volatile除了可以保证数据的可见性之外,还有一个强大的功能,那就是他可以禁止指令重排优化等

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **volatile和可见性:**对于volatile变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中。
  • **volatile和有序性:**volatile除了可以保证数据的可见性之外,还有一个强大的功能,那就是他可以禁止指令重排优化等。

**记忆锚点:**volatile → save → 由于遵守了缓存一致性 → 主存加载到自己的缓存 → 量仅仅会保证在该方法 → 而其他处理器的缓存

易错提醒:

  • 普通的变量仅仅会保证在该方法的执行过程中所依赖的赋值结果的地方都能获得正确的结果,而不能保证变量的赋值操作的顺序与程序代码中的执行顺序一致。

加分表达:

  • 所以,如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。
  • volatile和有序性 volatile除了可以保证数据的可见性之外,还有一个强大的功能,那就是他可以禁止指令重排优化等。

追问准备:

  • 围绕「volatile」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「save」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「由于遵守了缓存一致性」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

volatile和可见性 ​

对于volatile变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中。

所以,如果一个变量被volatile所修饰的话,在每次数据变化之后,其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议,也会把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile在并发编程中,其值在多个缓存中是可见的。

📄 ✅什么是MESI缓存一致性协议

打开文档:✅什么是MESI缓存一致性协议

volatile和有序性 ​

volatile除了可以保证数据的可见性之外,还有一个强大的功能,那就是他可以禁止指令重排优化等。

普通的变量仅仅会保证在该方法的执行过程中所依赖的赋值结果的地方都能获得正确的结果,而不能保证变量的赋值操作的顺序与程序代码中的执行顺序一致。

volatile是通过内存屏障来禁止指令重排的,这就保证了代码的程序会严格按照代码的先后顺序执行。这就保证了有序性。被volatile修饰的变量的操作,会严格按照代码顺序执行,load->add->save 的执行顺序就是:load、add、save。

如经典的双重校验锁必须加volatile的问题,就是因为volatile加了内存屏障。

📄 ✅有了synchronized为什么还需要volatile?

扩展知识 ​

内存屏障 ​

📄 ✅到底啥是内存屏障?到底怎么加的?

打开文档:✅到底啥是内存屏障?到底怎么加的?