概念
Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。
如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,因此Java1.5版本对其进行了重构,现在的Java8仍沿用了Java1.5的版本。
特性
- 原子性
一个操作是不可中断的,即便是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。 - 有序性
在并发时,程序的执行可能会出现乱序。 - 可见性
一个线程修改了某一个共享变量的值,其他线程是否能够立刻知道这个修改。(可见会牺牲性能) - Happen-Before 规则
- 程序顺序原则:一个线程内保证语义的串行性
- volatile 规则:volatile 变量的写,先发生于读,保证了 volatile 变量的可见性
- 锁规则:解锁必然发生在随后的加锁前
- 传递性:A 先于 B ,B 先于 C,那么 A 必然先于 C
- 线程的 start() 方法先于它的每一个动作
- 线程的所有操作先于线程的终结(Thread.join())
- 线程的中断先于被中断程序的代码
- 对象的构造函数执行结束先于 finalize() 方法