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

轻量锁偏向锁重量锁害人不浅!synchronized源码!

环境

源码环境搭建:https://blog.csdn.net/qq_35040959/article/details/149060610?spm=1011.2124.3001.6209
源码版本:jdk24

oop(java每个对象的header结构)

源码位置: src/hotspot/share/oops/oop.hpp#L51-L60
源码:

class oopDesc {private:// 对象头 Mark Word - 使用 volatile 确保内存可见性volatile markWord _mark;  // 占用 1 Word(8 字节/64位系统)// 类元数据联合体 - 通过指针压缩优化内存占用union _metadata {Klass*      _klass;             // 指向class类:普通指针(64位系统占8字节)narrowKlass _compressed_klass; // 压缩指针(32位占4字节)} _metadata; // 占用 1 Word(压缩时)或 2 Words(非压缩时)
}

对象头布局(内存布局)

对象头布局示例(64位系统):
[---------------------------------------------------------]
非压缩模式: [ markWord (8字节) | Klass* (8字节) ]
压缩模式: [ markWord (8字节) | narrowKlass (4字节) ]

markWord布局(记录对象基础信息)

  1. 初始状态(无锁):
 [31位哈希码 | 4位年龄 | 3位移位 | 0b01]
  1. 轻量级锁竞争:
  [64位栈锁记录地址 | 0b00]
  1. 锁膨胀过程:
 [ObjectMonitor* | 0b10]

源码位置:src/hotspot/share/oops/markWord.hpp:51
在这里插入图片描述

synchronized

字节码指令
在这里插入图片描述

monitorenter指令(上锁)

源码位置:InterpreterRuntime::monitorenter
在这里插入图片描述

加锁入口

源码位置:ObjectSynchronizer::enter
在这里插入图片描述

fast锁实现

源码位置:ObjectSynchronizer::enter_fast_impl
在这里插入图片描述

膨胀为重锁

源码位置:ObjectSynchronizer::inflate_impl

里面有一个无限循环,多线程竞争cas操作,直到有线程成功膨胀为重锁
在这里插入图片描述

重锁

源码位置:ObjectMonitor::enter

重锁无法退回到fast锁,所以升级后每次加锁还是会尝试cas直接修改锁拥有人

在这里插入图片描述
源码位置:ObjectMonitor::TrySpin
在这里插入图片描述
源码位置:ObjectMonitor::enter

进入安全点后即可处理gc等操作

在这里插入图片描述
源码位置:ObjectMonitor::EnterI

因为外层操作上循环:每次循环后都会重新尝试同过自旋获取锁

在这里插入图片描述

重锁-阻塞获取锁前的最后挣扎

源码位置:ObjectMonitor::EnterI

到这里可以发现 cas是低成本&高效的获取锁方案(避免的cpu切换上下文)

在这里插入图片描述

源码位置:src/hotspot/share/runtime/objectMonitor.cpp:834

真正进入阻塞获取后,不再自旋而是定时或等待唤醒后尝试cas获取锁

在这里插入图片描述

monitorexit 指令(下锁)

源码位置:ObjectMonitor::ExitEpilog
在这里插入图片描述

monitor流程图

在这里插入图片描述

八股文?爬!

八股文中介绍的轻量锁、偏向锁、重量锁真是害人不浅的无意义内卷;

http://www.dtcms.com/a/271205.html

相关文章:

  • eggNOG数据库注释文件
  • HCIA暑期作业
  • 阿里云和腾讯云RocketMQ 发消息和消费消息客户端JAVA接口
  • 高速公路门架系统的三种数据(交易流水、牌识流水、雷达轨迹)是怎么生成的
  • 区块链平台以太坊核心原理
  • 人工智能与机器学习暑期科研项目招募(可发表论文)
  • 【Modern C++ Part8】Prefer-nullptr-to-0-and-NULL
  • 小赛安全智脑×动态MCP Server:让组件API对接像搭积木一样简单
  • 基于lottie的微信小程序动画开发指南
  • [论文阅读] 软件工程 | 一篇关于开源许可证管理的深度综述
  • 轻松更改 Power BI 中的数据源类型
  • 川翔云电脑:突破硬件极限,重构设计生产力范式
  • 软件设计师中级概念题
  • Vue+ElementUI聊天室开发指南
  • 桌面开发,在线%图书管理系统%开发,基于C#,winform,界面美化,mysql数据库
  • 技术开发栈中 URL地址末尾加不加 “/“ 有什么区别?
  • 028_this关键字的使用场景
  • ABP VNext + Marten:事件溯源与 CQRS 全流程实战
  • Amazon SageMaker 部署 AIGC 应用:训练 - 优化 - 部署 - Web 前端集成应用实践
  • 解决IDEA缺少Add Framework Support选项的可行性方案
  • ObjectClear - 图像处理新革命,一键“抹除”图像中任意物体与阴影 支持50系显卡 一键整合包下载
  • 响应式原理二:响应式依赖收集
  • 前端进阶之路-从传统前端到VUE-JS(第四期-VUE-JS页面布局与动态内容实现)(Element Plus方式)
  • Higress 上架 KubeSphere Marketplace,助力企业构建云原生流量入口
  • 海信IP501H_GK6323处理器免拆卡刷包和线刷救砖包_当贝纯净版
  • 类模板的语法
  • 计算机网络实验——网线的制作和测试
  • 网安-SSRF-pikachu
  • RNN及其变体的概念和案例
  • Vue响应式原理一:认识响应式逻辑