JMM是一个抽象概念,描述的是一组规则,也可以被叫做规范。
我们在进行Java学习的过程中,JVM是我们经常听到的名词,但是对于JMM来说,我们好像怎么都找不到它,JMM也是我们面试过程中经常会涉及的点,对此,我们需要加以掌握。
JMM
JMM,它的英文全称为Java Memory Model,也就是Java内存模型,简称JMM。
JMM是一个抽象概念,描述的是一组规则,也可以被叫做规范。通过这组规范,定义了程序中的各个变量(实例字段、静态字段、构成数组对象的元素)
直到JDK1.2之前,JMM实现始终从主存(即共享内存)中读取变量,因此无需进行特殊的处理。使用当前Java内存模型,线程可以将变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中读写。
这就可能造成?个线程在主存中修改了?个变量的值,?另外?个线程还继续使?它在寄存器中的变量值的拷?,造成数据的不?致。
前面我们提到了JMM描述的是一组规则,那么我们来谈谈JMM关于同步的规定:
1.在线程解锁之前,必须将共享变量的值更新到主内存中。
2.线程加锁之前,必须将主内存中的较新值读取到自己的工作内存中。
3.加锁解锁是同一把锁。
lJVM运行程序的实体是线程,当它被创建时,当每个线程创建时,JVM都会为这些线程创建一个工作内存,工作内存是线程私有的区域,而JMM规定的所有变量就存储在主内存中。
l对于主内存来说,它是线程共享内存区域,所有的线程都可以进行访问,但是对于线程来说,线程对变量的操作必须要在工作内存中进行。
l首先,将内存从主内存拷贝自己的内存空间,然后对变量进行操作,在操作完成后,将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量拷贝副本。
因此,不同线程之间的工作内存是不可访问的,线程之间的通信必须通过主内存来完成。
总而言之,线程操作主内存中的数据要经历以下过程
1.从主内存中拷贝副本到工作内存中
2.操作该副本
3.操作完成后将变量写回到内存中