当前位置:网站首页>【并发编程045】什么是伪共享内存顺序冲突?如何避免?
【并发编程045】什么是伪共享内存顺序冲突?如何避免?
2022-04-21 09:54:00 【檀越剑指大厂】
什么是伪共享内存顺序冲突?如何避免?
由于存放到CPU缓存行的是内存块而不是单个变量, 所以可能会把多个变量存放到 同一个缓存行 中, 当多个线程同时修改 这个缓存行里面的多个变量时, 由于同时只能有一个线程操作缓存行 , 此时有两个线程同时修改同一个缓存行下的两个不同的变量, 这就是伪共享, 也称内存顺序冲突。
当出现伪共享时, CPU必须清空流水线, 会造成CPU比较大的开销。
如何避免:
JDK1.8 之前一般都是通过字节填充的方式来避免该问题, 也就是创建一个变量时使
用填充字段填充该变量所在的缓存行, 这样就避免了将多个变量存放在同一个缓存行中, 例如如下代码:
假如缓存行为64字节, 那么我们在 FilledLong 类里填充 了 6个long 类型的变
一个long 类型变量占用8字节, 加上自己的value 变量占用的8个字节, 总共 56 字节 。 另外, 这里FilledLong 是一个类对象, 而类对象的字节码的对象头占用8字节, 所以一个 FilledLong对象实际会占用64字节的内存, 这正好可以放入同一个缓存行。
JDK 提供了 sun.misc Contended 注解, 用来解决伪共享问题 。将上面代码修改为如下。

特别注意
在默认情况下, @Contended 注解只用于 Java 核心类, 比如rt包下的类。
如果用户类路径下的类需要使用这个注解, 需要添加JVM 参数: - XX:-RestrictContended 。 填充的宽度默认为 128, 要自定义填充宽度则可以通过参数 -XX:ContendedPaddingWidth 参数 进行设置。
版权声明
本文为[檀越剑指大厂]所创,转载请带上原文链接,感谢
https://qinyingjie.blog.csdn.net/article/details/124313643
边栏推荐
- 每日一题(2022-04-20)——文件的最长绝对路径
- 怎样卸载sql server2012数据库_cad2014无法卸载
- ConvNeXt
- JVM调优笔记
- You are using pip version 20.2.3; however, version 22.0.4 is available. You should consider
- A simple group chat function based on websocket
- 字符串匹配 KMP BF
- Using pycharm to load the QRC resource file in pyside2
- M3u8 Video Downloader IDM breaks through the failure to download protected data and cannot be restricted
- You are using pip version 20.2.3; however, version 22.0.4 is available. You should consider
猜你喜欢

Grid layout -- grid

2022年危险化学品生产单位安全生产管理人员特种作业证考试题库模拟考试平台操作

The display problem of gltf model with transparent map
![[hand in hand to prepare you for the video game] monochrome block recognition (based on openmv)](/img/85/34247a2470295bf6a61dcd7c0cafd9.png)
[hand in hand to prepare you for the video game] monochrome block recognition (based on openmv)

【总结】1296- 总结 12 个常见移动端 H5 与 Hybrid 开发问题

Esp32 tracing module test

CANoe:Vector Tool Platform是什么

Using pycharm to load the QRC resource file in pyside2

SAP导出物料库存量代码

2022年A特种设备相关管理(电梯)考试试题模拟考试平台操作
随机推荐
Redis deployment and use
Using pycharm to load the QRC resource file in pyside2
JVM调优笔记
Cilcate环境搭建
[Excel函数] COUNT函数 | COUNTIF函数 | COUNTIFS函数
Installation de MySQL dans docker sous CentOS
TensorflowEager的查看关闭开启
On the three paradigms of database design
外显子bed文件获取
【PyCharm Plugins】网上下载,来安装Translation插件
Esp32 tracing module test
[netty] is it difficult to implement a redis client by yourself?
JS——70行完成五子棋布局
51单片机基础之DS18B20温度传感器
事务的隔离级别与MVCC
Common commands of MySQL in Linux
Interview question of a small factory: what is false awakening?
2022制冷与空调设备运行操作考试题模拟考试题库及答案
7_数据分析—评估
One trick is to solve the servlet of servlet [dispatcher servlet] Init() threw an exception