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

【JavaEE】线程安全-内存可见性、指令全排序

目录

一、Java内存模型(JMM)

1.工作内存

1.1组成

1.2速度

1.3操作副本

2.主内存

2.1组成

2.2速度

2.3存储数据

二、Java处理数据

1.最大能预对

1.1极简自保式处理数据

1.1.1读取

1.1.1.1无副本

1.1.1.2有副本

1.1.2写入

2.无法预应对

2.1内存可见性

2.1.1私有数据无影响

2.1.2共享数据出问题

2.1.2.1多线程同一读写 - 读问题(线程安全-内存可见性)

2.1.2.2强制协调机制

2.1.2.2.1volatile

2.1.2.2.2synchronized

三、线程安全-指令全排序

1.原因

1.1各种各样来源

1.2各种各样排序

1.2.1贴

1.3各种各样赋容

2.解决

2.1块 - 锁机制

2.1.1加锁

2.1.2跳锁


一、Java内存模型(JMM)

1.工作内存

1.1组成

每个线程私有的 整块工作内存 由共cpu缓存、寄存器、硬件写缓冲区 分拼占成

工作内存
私有区
缓存存储副本
寄存器运算操作
硬件写缓区写回结果

1.2速度

工作内存 访问速度


1.3操作副本

线程 读取拷贝主内存数据 在它私有的CPU工作内存中 才能展开操作


2.主内存

2.1组成

主内存 由线程共享的堆、方法区 与 线程私有的 组成

主内存
共享区私有区
实例变量、数组元素方法局部变量、方法参数
方法区静态变量、常量

2.2速度

主内存 访问速度


2.3存储数据

线程 将它私有的工作内存数据 写入刷新到主内存中 登记结果


二、Java处理数据

1.最大能预对

线程 已经统一默认以 自先能最大确定的单线程 在有保障下的 且少动主内存 极简自保地处理数据,已做到 最大能应对到的 单线程的极致完美

1.1极简自保式处理数据

1.1.1读取
1.1.1.1无副本

读取时 工作内存无副本 就往主内存读取拷贝


1.1.1.2有副本

读取时 工作内存已经有副本了 就直接使用它副本会随机失效


1.1.2写入

写入时 工作内存里副本的写入修改结果 到不确定的自合适时机 再写入刷新到主内存


2.无法预应对

线程 没有也无法 预制考虑处理 单线程之外 多线程的各式参与协调,默认是 单线程的无协调

2.1内存可见性

2.1.1私有数据无影响

线程私有数据 转到多线程下 也与往常一样 还是单线程使用不会发生 无协调问题永久线程可见性安全


2.1.2共享数据出问题

线程共享数据 转到多线程下 就会发生 无协调问题

2.1.2.1多线程同一读写 - 读问题(线程安全-内存可见性)

多线程同一读写时,仅修改副本 未刷新主内存也刷新到主内存 但工作内存还只读已存副本此线程的修改它 彼线程不能及时读见它体现问题

例:1处读取问题

private static volatile SingletonLazy instance = null;
private SingletonLazy() { }
public static SingletonLazy getInstance() {if (instance == null) {//1synchronized (SingletonLazy.class) {if (instance == null) {instance = new SingletonLazy();}}}return instance;
}
  • 修改 及时读取到直接非空退出
  • 那时未能及时读取到 就会参与进锁竞争 再在进锁判断非空后 才最终也退出,增加了许多 不必要的同步开销

2.1.2.2强制协调机制

得手动 根据实际情况地 用强制工作内存读取主内存、强制工作内存立即写入主内存强制协调机制 去进行协调

2.1.2.2.1volatile

volatile 保变量内存 所有线程可见写入读取 都直接对主内存内容

(1)写入

写入后 volatile立即将 此线程工作内存里 此变量副本的修改结果 写入刷新到主内存,并使其它所有线程工作内存里的 该变量副本失效


(2)读取

读取时 读取的是主内存内容

  • 副本未失效 主内存未修改 直接读取与主内存一致的副本
  • 副本已失效 主内存已修改 往主内存读取主内存内容 拷贝到副本读

(3)禁止指令重排序

(3).1指令重排序

操作的指令序 都是默认极致单线程 往最高效 也无应对序排的:


(3).2屏障禁止

volatile变量指令 屏障地 禁止其它指令 横跃过它

—>避免了new操作中 为优化单线程执行效率 而将invokespecial调用构造函数初始化对象指令 与putstatic引用赋值指令(volatile变量指令) 重排序交换的可能发生


2.1.2.2.2synchronized

synchronized保 锁块内存 之间可见

(1)进锁

进锁块时 synchronized使此线程工作内存中 共享变量的副本失效


(2)出锁

出锁块时 synchronized使此线程 锁块内工作内存副本的修改 写入刷新到主内存


三、线程安全-指令全排序

多线程同一写 - 指令排序问题

1.原因

此线程与彼线程的修改块 互碎乱序

1.1各种各样来源

方法重复调用 + 线程一趟执行 来源


1.2各种各样排序

前后 碎块 贴隔 排序

1.2.1贴

单核下 指令最近可贴到 紧挨连续

多核下 指令最近可贴到 同时连续


1.3各种各样赋容

顺序来龙 赋内容


2.解决

2.1块 - 锁机制

class SingletonLazy {private static volatile SingletonLazy instance = null;private SingletonLazy() { }public static SingletonLazy getInstance() {if (instance == null) {//2.跳锁,instance都非空时 不加锁地 随意让它们碎处理都行synchronized (SingletonLazy.class) {//1.加锁,instance都为空时 锁成块地排序 执行if (instance == null) {instance = new SingletonLazy();}}}return instance;}
}
2.1.1加锁

赋内容 在碎上会出问题的 用锁限制碎 只能块地 前后块贴隔 排序


2.1.2跳锁

赋内容 在碎上不会出现问题的 就不加锁地 允许碎处理


文章转载自:

http://yLFZM0RP.nhzzn.cn
http://5AYtcuDv.nhzzn.cn
http://PkRFv9H3.nhzzn.cn
http://LqsTwijD.nhzzn.cn
http://twzC2HX5.nhzzn.cn
http://k5iQgwyq.nhzzn.cn
http://dfX8CTfD.nhzzn.cn
http://Soqn8C17.nhzzn.cn
http://KiNViB4Q.nhzzn.cn
http://AvIuLrUa.nhzzn.cn
http://RYGHo1nQ.nhzzn.cn
http://I3oYwv0c.nhzzn.cn
http://ljc7b3dJ.nhzzn.cn
http://zkvYLekf.nhzzn.cn
http://an1fpn9P.nhzzn.cn
http://bMSbPkYH.nhzzn.cn
http://mSV1900L.nhzzn.cn
http://ofa6Nxc0.nhzzn.cn
http://foRbsHYl.nhzzn.cn
http://K4JeKDYy.nhzzn.cn
http://QLLkYTvh.nhzzn.cn
http://1OiUBumb.nhzzn.cn
http://KacZgS31.nhzzn.cn
http://PFXFhlYf.nhzzn.cn
http://hV5hQ0Ai.nhzzn.cn
http://lf8ZvMrj.nhzzn.cn
http://iYxHWT0Z.nhzzn.cn
http://uYTLimMV.nhzzn.cn
http://ij19d1kS.nhzzn.cn
http://zkCjo7D6.nhzzn.cn
http://www.dtcms.com/a/384170.html

相关文章:

  • MCP传输机制完全指南:Stdio、SSE、Streamable HTTP详解-实践案例-整体对比
  • 基于C#的快递打单系统源码+数据库+使用教程
  • RabbitMQ 高可用实战篇(Mirrored Queue + Cluster + 持久化整合)
  • RabbitMQ 命令执行流程与内核数据结构
  • Dify:Step1 本地化安装部署on MACOS
  • 有鹿机器人:以智能清洁 redefine 服务,以灵活租赁开启可能
  • 9.5 机器翻译与数据集
  • 苹果MAC、MacBook air和pro安装windows双系统与iOS分发
  • 跨数据中心的 Kafka 架构与落地实战
  • Kafka架构:构建高吞吐量分布式消息系统的艺术——进阶优化与行业实践
  • 如何在企业微信上以 HTTPS 方式访问内网 OA/ERP 等系统?
  • iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
  • 细粒度文本分类
  • Go 并发模型学习:从 goroutine 到 channel 的最佳实践
  • 高效解决多语言视频分发难题:Amazon MediaConvert 多语言输入配置 + CMAF 通用容器输出优化实战
  • 摆脱劳心,奔向劳体
  • pcl案例五 求类平面点云孔区面积
  • 第6.2节 Android Agent开发<三>
  • 利用kimi k2编写postgresql协议服务端的尝试
  • 深入理解 Java 集合框架
  • 第十届99全球链商节重点项目“全球纸基生态战略联盟”正式签约
  • 系统服务包括1-4章
  • 自动化C到Rust翻译工具探索:工具实操、不足与挑战解析
  • RabbitMQ 事件驱动与多进程架构
  • 飞书视频,设计测试case
  • python 自动化从入门到实战-开发一个文件自动备份工具(7)
  • 量子能量泵:一种基于并联电池与电容阵的动态直接升压架构
  • 从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移
  • pgNow:一款免费的PostgreSQL监控与性能诊断工具
  • 【完整源码+数据集+部署教程】俯视视角交通场景图像分割系统: yolov8-seg-FocalModulation