news 2026/3/21 9:12:38

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/3/13 22:38:03

ESP32在Wi-Fi Station模式下的功耗优化策略

如何让 ESP32 在 Wi-Fi 下“省着用”?深度睡眠 按需联网的实战功耗优化指南 你有没有遇到过这样的问题:手里的 ESP32 做了个温湿度传感器,功能一切正常,可电池三天就没电了?明明代码没跑死循环,Wi-Fi 也连…

作者头像 李华
网站建设 2026/3/13 21:19:51

多模态AI系统构建:TensorFlow融合图文信息

多模态AI系统构建:TensorFlow融合图文信息 在社交媒体内容爆炸式增长的今天,一条短视频配文可能包含敏感图像与隐晦文本,单靠视觉或语言模型已难以准确判断其合规性。医疗领域中,医生不仅要看CT影像,还要结合病历描述做…

作者头像 李华
网站建设 2026/3/13 10:31:27

uv极速Python包管理实战:从零开始掌握现代开发工具链

uv极速Python包管理实战:从零开始掌握现代开发工具链 【免费下载链接】uv An extremely fast Python package installer and resolver, written in Rust. 项目地址: https://gitcode.com/GitHub_Trending/uv/uv 开篇故事:从7秒到1秒的性能飞跃 还…

作者头像 李华
网站建设 2026/3/16 16:40:13

Aurora博客系统终极搭建指南:快速构建个人技术博客

Aurora博客系统终极搭建指南:快速构建个人技术博客 【免费下载链接】aurora 基于SpringBootVue开发的个人博客系统 项目地址: https://gitcode.com/gh_mirrors/au/aurora Aurora是一个基于SpringBootVue开发的现代化个人博客系统,为技术爱好者和内…

作者头像 李华
网站建设 2026/3/14 3:18:13

mouclass!MousePnP调试记录被调用了好多次

mouclass!MousePnP调试记录被调用了好多次 1: kd> g 13:51:29.82889dd5240:0000RDPDYN_Dispatch 0680Unhandled PnP IRP with minor 00000018 Breakpoint 1 hit eax0000001b ebx00000000 ecx89936428 edx89be08d0 esi89be08d0 edi89c60530 eipf756b59c espf78ee97c …

作者头像 李华
网站建设 2026/3/17 21:59:37

Open-AutoGLM材料生成避坑指南,99%用户踩过的5个雷区,你现在躲开了吗?

第一章:Open-AutoGLM材料生成的核心价值Open-AutoGLM 是一种面向材料科学领域的开源自动化生成语言模型,其核心价值在于将自然语言处理能力与材料设计流程深度融合,显著提升新材料发现的效率与可解释性。通过理解科研人员输入的描述性需求&am…

作者头像 李华