文章已同步至GitHub开源项目: JVM底层原理解析
JVM虚拟机规范中曾经试图定义一种Java内存模型,来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都可以达到一致性的内存访问效果。
然而定义这样一套内存模型并非很容易,这个模型必须足够严谨,才能让Java的并发内存访问操作不会有歧义。但是也必须足够宽松,这样使得虚拟机的具体实现能够有自由的发挥空间来利用各种硬件的优势。经过长时间的验证和弥补,到了JDK1.5(实现了JSR133规范)之后,Java内存模型才终于成熟起来了。
Java内存模型规定了所有的变量都存储在主内存
(Main Memory)中,每条线程都有自己的工作内存
(Work Memory)
原子的
,不可再分
的)lock 锁定
: 作用于主内存,将一个变量标识为线程独占状态unlock: 解锁
: 作用于主内存,将一个线程独占状态的变量释放read 读取
: 从主内存读取数据到工作内存,便于之后的load操作load 载入
: 把read读取操作从主内存中得到的变量放入工作内存的变量副本中use 使用
: 将工作内存中的变量传递给执行引擎 当虚拟机遇到一个需要使用变量值的字节码时,执行此操作assign赋值
: 将执行引擎中的值赋给工作内存的变量。 当虚拟机遇到一个赋值操作时,执行此操作store存储
: 将工作内存的值传递到主内存 ,便于之后的write操作write写入
:将store存储操作中从工作内存中获取的变量写入到主内存中 volatile可以说是Java虚拟机提供的最轻量级的同步机制。但是它并不容易被正确,完整的理解。
Java内存模型中规定
当一个变量被定义为volatile
之后,表示着线程工作内存无效,对此值的读写操作都会直接作用在主内存上,
因此它具备对所有线程的立即可见性
。