1、什么是JMM模型
- JMM是一种抽象的概念,并不真实存在,是一组规范或者规则;关注的是多个线程对共享内存空间和线程私有工作空间的访问方式,围栏并发的原子性、有序性、可见性来展开的,想要了解JAVA的并发编程,就应该理解JMM。
- JMM通过定义了对变量(包括实例成员、静态成员和组成数组对象的元素)的访问方式,在程序运行时,运行程序的是实体是线程,每个线程创建时候,虚拟机都会为每个线程分配一定的内存空间,每个线程的内存空间用来存储线程私有的数据。但是JMM中规定数据都是存储在共享的主内存空间,而且每个线程不能直接操作主内存的空间,只能访问主内存的空间,且每个线程可以操作自己的工作空间,所以每个线程将自己用到的数据从共享的主内存空间中拷贝一份到其工作空间,操作完之后回写到主内存空间。
- 线程中的工作空间是私有的,线程之前不能访问对方的工作空间。比如线程A和线程B,A不能访问B的工作空间,同时,B也不能访问A的工作空间。
2、JVM运行时数据区 和JMM区别 和联系
区别:
JMM是一种抽象的概念,并不真实存在,是一组规范或者规则,通过规则来控制变量的访问。围绕多并发展开
运行时数据区域: 在JVM在运行程序时,内存的划分是具体的,是JVM运行时必要的内存划分
联系:
1、MM中内存有共享的内存空间和线程私有的工作空间,JVM运行时数据区有 方法区、堆、本地方法栈、虚拟机栈、程序计数器
2、JVM运行时数据区共享的内存空间有 方法区和堆,所以可以理解 JMM的共享内存区域包含了 方法区和栈。JMM的线程私有空间包含了 程序计数器、本地方法栈、虚拟机栈
3、 Java内存模型与硬件内存架构的关系
因为JMM只是一种抽象的概念,是一组规则,并不实际存在,不管是工作内存的数据还是主内存的数据,对于计算机硬件来说都会存储在计算机主内存、CPU缓存和CPU寄存器中,所以Java内存模型和计算机硬件内存架构是一个相互交叉的关系,是一种抽象概念划分与真实物理硬件的交叉。
4、JAVA内存模型数据同步8大原子操作
1、8大原子操作:
lock(锁定):把一个变量标记为一条线程独占状态
unlock(解锁):把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
read(读取):把主内存中的一个变量读取传输到线程的工作内存,以便随后load动作使用
load(加载):把read到线程工作内存的变量放入工作内存的变量副本中
use(使用):把线程工作内存中的一个变量值传递给执行引擎
assign(赋值):从执行引擎接收到的新值赋值给变量。返给工作内存
store(存储):把线程工作内存的一个变量值传递给主内存,以便后面的write使用
write(写入):把store到主内存的变量值赋值给变量
2、作用于主内存的原子操作: lock、unlock、read、write
3、作用于工作内存的原子操作:load、use 、assign、store