当前位置: 首页 > article >正文

【多线程】伪共享的概念

目录

          • 1. 说明
          • 2. 如何避免Java伪共享
            • 2.1 手动填充缓存行
            • 2.2 使用JDK8的@Contended注解
            • 2.3 使用volatile关键字

1. 说明
  • 1.伪共享是多线程编程中的一个性能问题,具体指在多线程环境中,不同线程更新同一缓存行中的不同变量时,由于缓存行的粒度,这些线程可能会频繁地读写同一缓存行,进而产生缓存冲突,导致程序性能下降。
  • 2.如果多个线程同时访问并更新位于同一个缓存行中的不同变量,就会触发缓存锁定,使得整个缓存行的内容都被锁定,其他需要访问该缓存行中任意变量的线程都将被迫等待。
2. 如何避免Java伪共享
2.1 手动填充缓存行
  • 1.由于CPU缓存行的大小一般为64字节或128字节,因此可以通过在变量之间插入足够数量的其他变量(如long类型),来占满一个缓存行,从而确保目标变量位于独立的缓存行中。
  • 2.例如,在需要避免伪共享的变量前后分别添加多个long类型的变量作为填充,这样目标变量就会被分配到独立的缓存行中,避免了与其他变量的缓存冲突。
2.2 使用JDK8的@Contended注解
  • 1.在JDK8及之后的版本中,可以使用@Contended注解来避免伪共享问题。
  • 2.这个注解只能用于类和属性,并需要手动启用JVM的-XX:-RestrictContended参数才能生效。
  • 3.使用@Contended注解后,编译器会自动进行内存填充,使得被注解的字段与其他字段占据不同的缓存行,从而避免伪共享。
  • 4.使用@Contended注解可能会改变内存布局,带来一些不可预期的行为,因此在使用时需要特别小心,并进行充分的测试和评估。
2.3 使用volatile关键字
  • 1.volatile关键字在Java中具有可见性和有序性的特性,这些特性有助于避免假共享问题。
  • 2.当一个线程修改了一个volatile变量的值时,其他线程可以立即看到这个修改,这保证了不同线程对volatile变量的读写操作都是可见的。
  • 3.volatile关键字可以禁止指令重排序,确保多线程程序的正确执行顺序。
  • 4.通过将需要避免伪共享的变量声明为volatile变量,可以减少线程之间的缓存冲突,从而避免伪共享问题。但需要注意的是,volatile关键字并不能保证原子性,如果需要保证原子性,还需要使用其他同步机制。

http://www.kler.cn/a/393882.html

相关文章:

  • 记录使用documents4j来将word文件转化为pdf文件
  • 基于Java Web的传智播客crm企业管理系统的设计与实现
  • 山泽光纤HDMI线:铜线的隐藏力量
  • 应用于新能源汽车NCV4275CDT50RKG车规级LDO线性电压调节器芯片
  • docker镜像源,亲测可用,时间2024-11-14
  • 「Py」Python基础篇 之 Python都可以做哪些自动化?
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
  • LeetCode 86.分隔链表
  • Unity插件-Smart Inspector 免费的,接近虚幻引擎的蓝图Tab管理
  • Linux系统编程多线程之条件变量和信号量讲解
  • 力扣--树题总结
  • sql文件
  • UniApp 应用、页面与组件的生命周期详解
  • Codeforces Round 984 (Div. 3)
  • 【Ubuntu pip安装mpi4py时报错】
  • 基于单片机的客车载客状况自动检测系统(论文+源码)
  • 从0开始深度学习(29)——文本预处理
  • golang通用后台管理系统08(菜单路由数据vue对接)
  • 科技查新小知识
  • 算法求解 -- (炼码 3854 题)计算满足条件的好二进制字符串数量
  • 基于SSM(Spring + Spring MVC + MyBatis)框架开发的电能计量与客服服务管理系统
  • 蓝队基础1
  • curl 安装最新版
  • 在 Spring Boot 中实时监控 Redis 命令流
  • 基于Java高校排课系统
  • Thread类及常见方法