Java内存模型

java并发采用的是共享内存模型,线程之间的通讯对程序员来讲是透明的,内存可见性问题很容易困扰着java程序员,今天咱们就来揭开java内存模型的神秘面纱。java

在揭开面纱以前,咱们须要认识几个基础概念:内存屏障(memory Barriers),指令重排序,happens-before规则,as-if-serial语义。程序员

什么是 Memory Barrier(内存屏障)?数组

内存屏障,又称内存栅栏,是一个CPU指令,基本上它是一条这样的指令:
一、保证特定操做的执行顺序。
二、影响某些数据(或则是某条指令的执行结果)的内存可见性。缓存

编译器和CPU可以重排序指令,保证最终相同的结果,尝试优化性能。插入一条Memory Barrier会告诉编译器和CPU:无论什么指令都不能和这条Memory Barrier指令重排序。并发

Memory Barrier所作的另一件事是强制刷出各类CPU cache,如一个 Write-Barrier(写入屏障)将刷出全部在 Barrier 以前写入 cache 的数据,所以,任何CPU上的线程都能读取到这些数据的最新版本。app

这里写图片描述
这和java有什么关系?volatile是基于Memory Barrier实现的。ide

若是一个变量是volatile修饰的,JMM会在写入这个字段以后插进一个Write-Barrier指令,并在读这个字段以前插入一个Read-Barrier指令。性能

这里写图片描述
这意味着,若是写入一个volatile变量a,能够保证:
一、一个线程写入变量a后,任何线程访问该变量都会拿到最新值。
二、在写入变量a以前的写入操做,其更新的数据对于其余线程也是可见的。由于Memory Barrier会刷出cache中的全部先前的写入。优化

happens-before线程

从jdk5开始,java使用新的JSR-133内存模型,基于happens-before的概念来阐述操做之间的内存可见性。

在JMM中,若是一个操做的执行结果须要对另外一个操做可见,那么这两个操做之间必需要存在happens-before关系,这个的两个操做既能够在同一个线程,也能够在不一样的两个线程中。

与程序员密切相关的happens-before规则以下:
一、程序顺序规则:一个线程中的每一个操做,happens-before于该线程中任意的后续操做。
二、监视器锁规则:对一个锁的解锁操做,happens-before于随后对这个锁的加锁操做。
三、volatile域规则:对一个volatile域的写操做,happens-before于任意线程后续对这个volatile域的读。
四、传递性规则:若是 A happens-before B,且 B happens-before C,那么A happens-before C。

注意:两个操做之间具备happens-before关系,并不意味前一个操做必需要在后一个操做以前执行!仅仅要求前一个操做的执行结果,对于后一个操做是可见的,且前一个操做按顺序排在后一个操做以前。

指令重排序

在执行程序时,为了提升性能,编译器和处理器会对指令作重排序。可是,JMM确保在不一样的编译器和不一样的处理器平台之上,经过插入特定类型的Memory Barrier来禁止特定类型的编译器重排序和处理器重排序,为上层提供一致的内存可见性保证。

一、编译器优化重排序:编译器在不改变单线程程序语义的前提下,能够从新安排语句的执行顺序。
二、指令级并行的重排序:若是不存l在数据依赖性,处理器能够改变语句对应机器指令的执行顺序。
三、内存系统的重排序:处理器使用缓存和读写缓冲区,这使得加载和存储操做看上去多是在乱序执行。

数据依赖性

若是两个操做访问同一个变量,其中一个为写操做,此时这两个操做之间存在数据依赖性。
编译器和处理器不会改变存在数据依赖性关系的两个操做的执行顺序,即不会重排序。

as-if-serial

无论怎么重排序,单线程下的执行结果不能被改变,编译器、runtime和处理器都必须遵照as-if-serial语义。

抽象结构

java线程之间的通讯由java内存模型(JMM)控制,JMM决定一个线程对共享变量(实例域、静态域和数组)的写入什么时候对其它线程可见。

从抽象的角度来看,JMM定义了线程和主内存Main Memory(堆内存)之间的抽象关系:线程之间的共享变量存储在主内存中,每一个线程都有本身的本地内存Local Memory(只是一个抽象概念,物理上不存在),存储了该线程的共享变量副本。

因此,线程A和线程B以前须要通讯的话,必须通过一下两个步骤: 一、线程A把本地内存中更新过的共享变量刷新到主内存中。 二、线程B到主内存中读取线程A以前更新过的共享变量。

相关文章
相关标签/搜索