volatile的实现原理

概述

  • volatile的两个语义

volatile的两个语义是什么

  1. 保证变量对所有线程的可见性
  2. 禁止机器级别的指令重排序优化

volatile如何保证变量对所有线程的可见性的

当一个变量被volatile关键字修饰之后,如果某个线程修改了该变量的值,其他线程会得到更新通知,其他线程在使用该变量时就会去主内存中刷新该变量的值

volatile是如何禁止机器级别的指令重排序优化的

通过反汇编机器指令,可以看到被volatile修饰的变量在赋值后多了一个lock操作,这个操作相当于一个内存屏障,重排序时不能把lock之后的指令重排序到lock之前,对应到DCL例子来说,就是返回实例对象这个操作对应的指令不能在给volatile变量赋值之前执行,保证了其他线程拿到实例对象是可用的,是已经正确实例化的对象

参考链接

《深入理解Java虚拟机·JVM高级特性与最佳实践》第12章 Java内存模型与线程 12.3.4节