news 2026/6/15 11:42:35

Java常见技术分享-14-多线程安全-锁机制-常见的锁以及底层实现-synchronized

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java常见技术分享-14-多线程安全-锁机制-常见的锁以及底层实现-synchronized

synchronized

核心特性
  • 可重入(同一线程可以多次获取同一个对象的锁, 不会因为自己已经持有的锁陷入阻塞)
  • 互斥 (同一时间内只有一个线程持有锁, 线程安全的核心)
  • 悲观 (假设线程的冲突概率高, 直接加锁, 悲观策略,让synchronized 在竞争激烈的情况下很稳定)
针对悲观策略 JDK1.6 之后的重大升级

在JDK1.6 之前 synchronized就是 纯悲观策略, 不管竞争是否激烈, 只要进入代码块, 直接加上重量级锁(阻塞与唤醒)。
JDK1.6之后, 就变成了根据竞争的激烈程度进行升级。
一开始是偏向锁, 只有一个线程的时候, 系统会在对象头记录 这个线程ID, 下次再进入同步代码块, 就不用申请锁了, 直接就能执行。
当有第二个线程 想要竞争锁的时候, 偏向锁 就会升级成轻量级锁, 即虚拟机 发现第二个线程要锁, 且对象头里记录的ID不是第二个线程的。
这时每个线程都会复制一份对象头 里的锁信息, 然后 双方都尝试用CAS操作 去 修改 对象头 里的 锁标记 成 自己的线程ID, 当修改成功 就拿到锁了。
具体的流程是, 在竞争之前 , 会先复制一份 锁标记的信息 , 然后在自己的存储区域 计算出 自己的锁记录地址 ,比如 0x456,更新 锁标记信息, 然后 对 对象头 里的锁标记 信息 执行CAS操作, 把自己的 新的 锁标记信息 更新到对象头上, 执行成功 就拿到锁了。
如果没成功, 就会自旋式的请求锁.(补充一个场景, 如果线程B拿到了锁, 锁标记中的锁记录地址是 0x456, 如果线程C进来 复制了 锁信息 ,是0x456, CAS操作, C虽然 确实 锁记录地址 与预期一致, 但是会因为线程B还在持有锁 而被阻止, 所以会失败, 知道线程B释放锁, 把 锁标记 重新改为默认的mark word副本)。
当同时 自旋的线程 或者 线程的自旋的次数 过多。 就会升级为重量级锁。
对象头里边 会存储一个 指向monitor对象的指针, 这个monitor对象就像一个锁管家 ,当线程竞争失败, 就会被monitor对象标记为阻塞状态,放入等待队列。 不会占用CPU资源。 需要注意的是 锁记录地址 转移到了monitor对象里边。

卧槽今天北京太冷了, 顶不住。 后面其实还有几个锁的,后面的篇章再说吧

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 3:18:24

Arduino ESP32通俗解释:deep sleep低功耗模式

Arduino ESP32低功耗实战:用Deep Sleep让电池撑两年你有没有遇到过这样的情况?辛辛苦苦做了一个基于ESP32的温湿度监测器,连上Wi-Fi定时上传数据,功能完美。可一换上电池——不到一天就没电了。别急,这不怪你代码写得差…

作者头像 李华
网站建设 2026/6/10 15:03:37

如何快速使用LOOT:游戏模组优化的完整指南

如何快速使用LOOT:游戏模组优化的完整指南 【免费下载链接】loot A modding utility for Starfield and some Elder Scrolls and Fallout games. 项目地址: https://gitcode.com/gh_mirrors/lo/loot LOOT(Load Order Optimization Tool&#xff0…

作者头像 李华
网站建设 2026/6/13 5:01:45

三星固件下载终极指南:使用Samloader轻松获取官方固件

三星固件下载终极指南:使用Samloader轻松获取官方固件 【免费下载链接】samloader Download Samsung firmware from official servers 项目地址: https://gitcode.com/gh_mirrors/sa/samloader 想要为你的三星设备下载最新固件吗?Samloader是一个…

作者头像 李华
网站建设 2026/5/17 3:23:51

Qwen1.5-4B模型极限部署:4GB显存实战指南

Qwen1.5-4B模型极限部署:4GB显存实战指南 【免费下载链接】Qwen1.5 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5 还在为显卡显存不足而无法体验大语言模型而苦恼吗?🤔 4GB显存的设备真的能流畅运行Qwen1.5-4B这样的先…

作者头像 李华
网站建设 2026/5/22 23:32:40

数学公式识别:TensorFlow OCR扩展应用

数学公式识别:TensorFlow OCR扩展应用 在数字化浪潮席卷教育、科研和出版领域的今天,一个看似简单却长期困扰工程师的问题正被重新审视——如何让计算机真正“读懂”数学公式?纸质试卷上的积分表达式、手写笔记中的矩阵运算、PDF文档里排版复…

作者头像 李华
网站建设 2026/6/13 0:01:47

eSPI中断请求信号解析:手把手分析IRQ工作流程

eSPI中断请求信号解析:手把手拆解IRQ如何从按键传到CPU你有没有想过,当你按下笔记本的电源键,为什么系统能在短短十几毫秒内开始响应?这背后不只是硬件通电那么简单——真正触发系统“苏醒”的,是一条隐藏在芯片之间的…

作者头像 李华