JMM(java内存模型)是你想要的了解多线程入门的一个必备知识,很多人新手都会把JVM和JMM搞混淆。在这先提出一点,JVM和JMM是两个不同的概念
JVM是java虚拟机,是一个真实存在的“物体”。
JMM(Java内存模型(即Java Memory Model,简称JMM))本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量。
网上有很多帖子都说JVM和JMM是有关联性的。但是在我看来JMM中的主内存,工作内存和JVM中的java堆,栈以及方法区并不是属于同一个层次的内存划分。两者来说是基本上没有关系的。如果非要关联对应起来,那么从变量,主内存和工作内存的定义来看,主内存只要对应于java堆中的对象方法实例数据部分,而工作内存则是对应于虚拟机栈中的部分区域(局部变量表类似。。。。)------这部分大家如果有不同见解请提出
说了那么多,开始进入正题。
为什么说JMM是学习java并发编程的必需品呢。在并发编程中,我们最需要的就是保证数据的准确性。
还记得并发编程三要素吧
1.原子性
2.可见性
3.有序性
简单的解释一下,
原子性:例如像CAS操作一样。那么执行成功,要么就不执行。比如:你去给别人转账,通常来说会有三步:你的钱->银行(进行流水记录)->张三的账户。如果你的钱成功的到了银行,但是银行到张三的账户这一操作失败了。那么整体操作就算是失败,银行会把钱退给你。这笔操作失败。
可见性:一个线程对共享变量的修改,能够及时的被其他线程看到
有序性:即程序执行的顺序按照代码的先后顺序执行。举个简单的例子,看下面这段代码:
int i = 0;
boolean flag = false;
i = 1; //语句1
flag = true; //语句2
上述代码如果满足有序性,那么就会从第一行的int i=0开始顺序执行直到flag=true
-----------------------------------------我是分割线-------------------------------------------------
上图