Java内存模型

Java内存模型

(一)并发编程模型

(1)两种并发模型

俩种并发模型:
1:消息传递并发模型
2:共享内存并发模型
在这里插入图片描述
在Java中,使用的是共享内存并发模型。

(二)Java内存模型的抽象结构

(1)模型结构

在这里插入图片描述
对于每一个线程来说,栈都是私有的,而堆是共有的。

也就是说在栈中的变量(局部变量、方法定义参数、异常处理器参数)不会在线程之间共享,也就不会有内存可见性的问题,也不受内存模型的影响。而在堆中的变量是共享的,称为共享变量。

所以,内存可见性是针对的共享变量。

(2)Java内存模型(简称JMM)

【思考】既然堆是共享的,为什么在堆中会有内存不可见问题?
这是因为现代计算机为了高效,往往会在高速缓存区中缓存共享变量,因为cpu访问缓存区比访问内存要快得多。

线程之间的共享变量存在主内存中,每个线程都有一个私有的本地内存,存储了该线程以读、写共享变量的副本。本地内存是Java内存模型的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器等。

Java线程之间的通信由Java内存模型(简称JMM)控制,从抽象的角度来说,JMM定义了线程和主内存之间的抽象关系。JMM的抽象示意图如图所示:
在这里插入图片描述
【说明】
1:所有的共享变量都存在于主内存中
2:每一个线程都保存了一份该线程使用到的共享变量的副本
3:如果线程A与线程B之间要通信的话,必须经历下面俩个步骤
线程A将本地内存A中更新过的共享变量刷新到主内存中去
线程B到主内存中去读取线程A之前已经更新过的共享变量

注意:
1:线程A无法直接访问线程B的工作内存,线程间通信必须经过主内存。
2:每一个刷新操作会将当前工作内存变量都更新到主内存中
3:JMM规定,线程对共享变量的所有操作都必须在自己的本地内存中进行,不能直接从主内存中读取。
4:JMM通过控制主内存与每个线程的本地内存之间的交互,来提供内存可见性保证。

(3)JMM与Java内存区域划分的区别与联系

【区别】:两者是不同的概念层次。JMM是抽象的,他是用来描述一组规则,通过这个规则来控制各个变量的访问方式,围绕原子性、有序性、可见性等展开的。而Java运行时内存的划分是具体的,是JVM运行Java程序时,必要的内存划分。

【联系】:都存在私有数据区域和共享数据区域。一般来说,JMM中的主内存属于共享数据区域,他是包含了堆和方法区;同样,JMM中的本地内存属于私有数据区域,包含了程序计数器、本地方法栈、虚拟机栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZWZhangYu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值