(2021-02-09)JMM-java内存模型详解

本文详细介绍了Java内存模型(JMM),澄清了其与JVM的区别,并强调了JMM在多线程并发编程中的重要性。文章通过并发编程的三要素——原子性、可见性和有序性,解释了为何JMM必不可少。讨论了volatile关键字的作用,包括保证可见性和防止指令重排序,并指出其无法确保原子性。最后,对比了synchronized的原子性和可见性保证,提醒开发者在使用volatile时要谨慎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

-----------------------------------------我是分割线-------------------------------------------------

上图

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值