CPU缓存伪共享

CPU缓存行(Cache Line)

cpu缓存是由多一个缓存行组成的,缓存行时cpu缓存的最小缓存单元。目前主流的cpu缓存的缓存行大小都是64Bytes。

也就是说,如果一个512字节(512 / 64 = 8)的一级缓存,就存在8个缓存行组成。如果缓存行存储的是long类型的数据,那么每个缓存行可以存储8个(64 / 8 = 8)long类型的数据。

缓存行的加载

cpu缓存的最小单元是缓存行,加载数据时,也是一次最少从主内存中加载连续的一个缓存行的数据大小,也就是64Bytes。cpu默认认为你如果操作了一个变量,那么该变量附近的数据也大概率也会进行操作,因此一次性加载一个缓存行的数据,可以减少数据加载的次数,进而提高性能。

但这种加载至少一个缓存行的数据,也存在问题。

当线程修改相互独立的变量时,如果这些变量共享同一个缓存行,则会无意间影响彼此的性能,这就是伪共享。

例如,long a = 100, b = 200; a和b在同一个缓存行内,当线程A修改变量a时,根据MESI协议,B线程中的缓存将变成无效状态I;因此当B线程需要修改变量b时,发现该缓存行已经失效,则必需从主内存中重新加载该缓存行,然后再进行b变量的修改,线程B的性能由于线程A的操作而降低了;但其实A线程只会修改变量a,而B线程只会修改变量b,这种相互独立的操作,却相互影响了性能。

避免伪共享

1. 手动补齐

手动补齐64字节大小

2.注解@Contended

该注解默认是无效的,需要在jvm中开启-XX: RestrictContened

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值