java memory model

什么是JMM

JMM就是Java内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果。
在计算机硬件层面,CPU在处理指令时,会先从L1,L2,L3缓存中拉取数据,如果没有再从主内存中获取,JMM就是再CPU缓存和主内存之间协调,定义了Java线程基本的工作方式,保证了原子性,可见性,有序性的。
Java内存模型规定所有的变量都存储在主内存中,包括实例变量,静态变量,但是不包括局部变量和方法参数。每个线程都有自己的工作内存,线程的工作内存保存了该线程用到的变量和主内存的副本拷贝,线程对变量的操作都在工作内存中进行,然后再刷回主内存,线程不能直接读写主内存中的变量。

java memory model_第1张图片

JMM8种内存交互方式

java memory model_第2张图片

lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。
unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。
assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的write操作使用。
write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

JMM特征

原子性
JMM只能保证基本的原子性,如果要保证一个代码块的原子性,提供了monitorenter 和 moniterexit 两个字节码指令,也就是 synchronized 关键字。因此在 synchronized 块之间的操作都是原子性的。

可见性
可见性是指变量的变化及在线程之间是可见的
volatile:当变量被volatile修饰时,这个变量被修改后会立即刷新到主内存中,当线程读取这个变量时,也会直接从主内存中读取(当volatile修饰的是引用数据类型,只能保证引用的内存地址是可见,不保证对象的内部属性可见)
synchronized:在执行完同步代码后,unlock之前必须把共享变量刷新到主内存中。
final:常量,线程无法更改。

有序性
volatile:使用内存屏障达到禁止指令重排序,以保证线程操作的有序性。
synchronized:一个线程lock之后,必须unlock后,其他线程才可以重新lock,使得被synchronized包住的代码块在多线程之间的操作是串行执行的。

你可能感兴趣的:(java后端)