从CPU缓存行说说JDK8的@Contended

从jdk8的@Contended说CPU缓存行:
CPU从内存中读取数据实际上是按块读取的,而这个块的大小设定将很大程度的影响着程序执行效率;
CPU在处理完一个数据后,会去处理接下来的数据,所以将内存得数据按块读取到缓存,不需要再去内存中拿数据,可以很好的提高效率,而这个块就被叫做“缓存行”;

缓存行的大小设定显得尤为重要,缓存行越大,局部效率更高,而读取时间变长,空间有效率更低;
反之越小,局部效率变低,读取时间更小,空间利用率高;64字节是业界认定非常合适的中间值,
在这里插入图片描述
在这里插入图片描述

大家看这个图,那多核CPU就会遇到这样一个问题,xy的数据在一个缓存行,第一个核将x改了,第二个核将y改了,他们再使用另一个值的时候,他们都不知道值变了,这就是缓存一致性的问题,怎么来解决这个问题呢? 看下面这个图
在这里插入图片描述

这里是给了缓存行四种状态:
Modified–被修改了
Exclusive–独占
Shared–共享
Invalid–无效的
当出现上述说所的情况时,第一个核需要将缓存行的状态修改为Modified,通知其他核心将自己的缓存行修改为Invalid,去内存中读取新的值;
Java代码体现:
将17行代码放开和注释掉 会有一倍的耗时差距,原因就在于long占用8字节,如果加上7个long变量,则arr[o]和arr[1]将不会处于同一缓存行,就不会涉及到核心之间的缓存行同步,
在这里插入图片描述

而jdk8中增加了@Contended注解解决缓存伪共享的问题,
但是需要在jvm中增加参数才能生效:
-XX:-RestructContended

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值