编辑
2024-02-15
面试题库
0
请注意,本文编写于 342 天前,最后修改于 196 天前,其中某些信息可能已经过时。

volatile 关键字具有以下特性

  • 可见性:保证被修饰的变量在被一个线程修改后,能立即被其他线程看到最新值,而不是从本地缓存中读取旧值。

  • 禁止指令重排序:确保 volatile 变量相关的操作不会被编译器或处理器重排序。

volatile 的原理主要基于以下几点

  • 内存屏障:在对 volatile 变量进行写操作时,会插入一个写屏障,强制将当前线程对应的本地内存中的共享变量值刷新到主内存。在读操作时,会插入一个读屏障,强制从主内存中读取最新的值到本地内存。

  • 缓存一致性协议:现代处理器通常使用缓存一致性协议(如 MESI 协议)来保证多个处理器缓存之间的数据一致性。当一个处理器修改了 volatile 变量,会通过缓存一致性协议通知其他处理器使对应的缓存行失效,从而保证其他处理器再次读取时从主内存获取最新值。

在一个多线程环境中,一个线程修改了 volatile 修饰的变量 flag 为 true ,另一个线程能够立即感知到这个变化并做出相应的处理。这是因为 volatile 的可见性特性保证了变量值的及时更新,避免了线程因为读取本地缓存中的旧值而导致的错误行为。同时,禁止指令重排序特性确保了相关操作的顺序不会被意外改变,从而增强了程序的可预测性和正确性。

本文作者:whitebear

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!