企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] <br/> > ### volatile * 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。 * `volatile`关键字只能修饰变量。 * `volatile`关键字的可见性,volatile 修饰的成员变量在每次被线程访问时,都强迫从主存(共享内存)中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主存(共享内存),并通知其他线程对该变量的缓存失效。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值,这样也就保证了同步数据的可见性。 > ### `volatile`适用场景 * 对变量的写入操作不依赖其当前值,如`i++` * 该变量没有包含在具有其他变量的不变式中 > ### 底层原理 * `volatile`变量修饰的共享变量进行写操作的时候在汇编层会对该命令添加`Lock`前缀,该指令在多核处理器下会引发两件事情 * 将当前处理器缓存行的数据写回到系统内存 * 这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效 > ### 缓存一致性协议`MESI` * `Modified`被修改,`Exclusive`独享的,`Shared`共享的,`Invalid`无效的