并发编程模型分类

前言

之前的文章介绍了java内存模型的基础,之前说过,程序在执行的时候,并不是一定按照你写的顺序执行的。他会有有两个重排序,一个是编译器级别的,一个是处理器级别的。编译器级别的是通过jmm可以直接进行控制。处理器级别的不受java的控制,这个时候怎么办呢,我当时说过,会用到内存屏障,这个我在介绍jvm的时候也说到过这个词。今天通过介绍这个模型分类,再次介绍下这个内存屏障。

处理器的重排序

现代的处理器使用写缓冲区临时保存向内存写入的数据。写缓冲区可以保证指令流水线的持续进行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。同时,通过批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一内存地址的多次写,减少对内存总线的占用。虽然写缓冲去好处多多,但是它也有坏处,也就是写缓冲区,仅对自己的处理器可见。这个特性会导致对内存操作的执行顺序产生重要的影响(其实就是处理器对内存操作的读写执行顺序,不一定和内存实际发生的读写顺序一致)。

在这里插入图片描述
结果为什么是x=y=0呢,不应该是x=2,y=1吗。造成这个结果的原因是什么呢。大家看下面的图
在这里插入图片描述
如果按照A1A2,B1B2这种顺序操作的话,最后的xy的数据肯定是对的。但是如果按照A2A1,B2B1这种顺序的话,xy的值就可能为0了。这个指令都是在自己的处理器的缓冲区,他会对这个指令进行重排序,可能和实际的内存操作指令不太一直。那么为了保证指令不被重排序,jmm使用了内存屏障。

内存屏障

内存屏障大致有四个类型,看下表
在这里插入图片描述
load1装载的意思就是吧内存的数据读到cpu的缓存中,store就是把处理器缓存的数据刷到内存中,现在大家对于内存屏障有一个清晰的认知了吧。然后storeload屏障是一个全能的屏障,它同时支持其他三个屏障的效果。现在处理器,大多数支持该屏障(其它屏障不一定被所有处理器支持),但是支持该屏障的开销很大。

总结

内存屏障不管是在java内存模型中,还是在jvm虚拟机中都是一个十分重要的概念,希望大家可以对这个有一个清晰的认知。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mark---小鑫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值