浅谈Java内存模型(JMM)
1. 什么是JMM?
- JMM(Java内存模型)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。总结:就是规范,抽象的模型。
*
1)内存:共享的数据
2)工作空间:工作内存,基本数据类型,直接分配到工作内存,引用类型的数据将引用的地址存放在工作内存,引用的对象存放堆中。
3)工作方式:
A 线程修改私用数据,直接在工作空间修改。
B 线程修改共享数据,把数据复制到工作空间中去,在工作空间修改,修改完毕以后,再刷新内存中的数据。
2.JMM用来干什么?
- JMM是Java内存模型,既然是模型,必定是能提供一种规范指导产出一种产品的东西。那么JMM指导的是什么呢?JVM就是根据JMM在物理内存划分出的结果。Java内存模型的作用是规范内存数据和工作空间数据的交互 。
3.计算机与JMM
- 先看看计算机的硬件内存架构:
*
计算机硬件架构存在的问题:
多个CPU并行处理缓存数据时,并发处理的不同步,会产生数据一致性问题。
解决方案:
Ⅰ. 总线加锁:CPU核执行一个线程去访问数据做操作的时候,向总线上发送一个LOCK信号,通过把内存和CPU之间的通信锁住,把并行化的操作变成了串行。虽然能解决一致性问题,但是会导致很严重的性能问题。
Ⅱ. 缓存的一致性协议(MESI):当CPU在Cache中操作数据时,如果该数据是共享变量,数据在Cache读到寄存器中,进行新修改,并更新内存数据Cache Line置无效。其他的CPU拿取数据,若Cache Line为无效会从内存中拿取。
JMM与计算机的硬件内存架构非常的相似。所以会遇到相似的问题和对应问题的解决方案。并发会有三个重要的特征,Java对这些特征有对应的保证方式:
- 1、原子性:不可分割,像变量的赋值x=1便是原子性,但y=x没有原子性,因为先是从x读到工作空间(原子性),把x的值写到y(原子性)。同理x++,z=z+1都没有原子性。多个原子性的操作合并没有原子性。(Java的保证操作:Synchronized 、JUC Lock的lock)
- 2、可见性:线程只能操作自己工作空间中的数据(Java的保证操作:Volatile、Synchronized、JUC Lock的lock)
- 3、有序性:程序中的顺序不一定就是执行的顺序,因为涉及编译时编译重排序、指令重排序来提高效率(Java的保证操作: Volatile、Synchronized)
创作不易,转载请注明出处!