前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >synchronized锁升级

synchronized锁升级

作者头像
默 语
发布2024-11-25 15:05:09
发布2024-11-25 15:05:09
980
举报
文章被收录于专栏:JAVAJAVA
synchronized锁升级

博主 默语带您 Go to New World.个人主页—— 默语 的博客👦🏻 优秀内容 《java 面试题大全》 《java 专栏》 《idea技术专区》 《spring boot 技术专区》 《MyBatis从入门到精通》 《23种设计模式》 《经典算法学习》 《spring 学习》 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


默语是谁?

大家好,我是 默语,别名默语博主,擅长的技术领域包括Java、运维和人工智能。我的技术背景扎实,涵盖了从后端开发到前端框架的各个方面,特别是在Java 性能优化、多线程编程、算法优化等领域有深厚造诣。

目前,我活跃在CSDN、掘金、阿里云和 51CTO等平台,全网拥有超过10万的粉丝,总阅读量超过1400 万。统一 IP 名称为 默语 或者 默语博主。我是 CSDN 博客专家、阿里云专家博主和掘金博客专家,曾获博客专家、优秀社区主理人等多项荣誉,并在 2023 年度博客之星评选中名列前 50。我还是 Java 高级工程师、自媒体博主,北京城市开发者社区的主理人,拥有丰富的项目开发经验和产品设计能力。希望通过我的分享,帮助大家更好地了解和使用各类技术产品,在不断的学习过程中,可以帮助到更多的人,结交更多的朋友.


我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。


你对 synchronized 锁机制 和其优化技术的总结非常详细,涵盖了锁的不同状态和实现细节。我将对你的内容稍作整理,以更清晰地展示各个核心点,并补充一些容易混淆的地方。


synchronized 锁的基本用法

synchronized 是 Java 提供的一种内置锁机制,用于线程同步。其主要用法分为三种类型:

分类

具体分类

锁对象

格式

方法

普通方法

实例对象

public synchronized void method()

静态方法

类对象

public static synchronized void method()

代码块

实例对象代码块

实例对象

synchronized(this){}

Class对象

类对象

synchronized(CLazz.class){}

任意Object实例

任意实例对象

synchronized(lockObject){}

锁对象的影响
  • 实例对象锁:如果锁定的是对象实例,其他线程通过不同实例访问同一代码块时不会同步。
  • 类对象锁:如果锁定的是类对象,那么无论是通过类还是实例,访问锁定代码块都会同步。

synchronized 的执行机制
  • 代码块:通过 monitorentermonitorexit 指令实现。
  • 方法:通过 ACC_SYNCHRONIZED 修饰符标识同步。

锁的优化:从无锁到重量级锁

Java 在 JDK 6 之后通过 偏向锁、轻量级锁 和 重量级锁 提高了锁的性能。这些优化基于对象头中的 MarkWord 字段实现。

对象头结构
  • 在 32 位虚拟机中,MarkWord 包括:
    • 哈希码(25 位)
    • 分代年龄(4 位)
    • 锁标志(2 位)
    • 偏向标志(1 位)
无锁状态
  • 初始状态,未被任何线程持有。
  • 标志位:
    • 偏向锁标志:0
    • 锁标志:01

偏向锁
  • 特点:偏向锁旨在优化单线程情况下的锁获取开销,避免CAS操作。
  • 获取过程:
    1. 检查锁标志为 01 且偏向锁标志为 0
    2. 如果满足条件,当前线程的 ID 写入 MarkWord
    3. 设置偏向锁标志为 1
  • 重入:同一线程再次进入时,直接通过检查 MarkWord 中的线程 ID 确认,无需任何额外操作。
  • 撤销:当另一线程尝试获取锁但发现其已偏向其他线程时,撤销偏向锁。
偏向锁的升级
  • 如果锁竞争发生,偏向锁可能升级为轻量级锁。

轻量级锁
  • 特点:通过自旋等待来实现,适合短时间内无大量竞争的场景。
  • 获取过程:
    1. 持有偏向锁的线程保存 MarkWord 到线程的锁记录(Lock Record)。
    2. 设置 MarkWord 指向线程的锁记录。
    3. 标志位为 00
  • 撤销:轻量级锁会在使用后主动撤销,将 MarkWord 恢复原值。
  • 升级:若自旋超出限定次数或有大量线程竞争,升级为重量级锁。

重量级锁
  • 特点:通过 ObjectMonitor 实现,阻塞线程等待锁释放。
  • 获取过程:
    • 修改标志位为 10
    • 将等待的线程从自旋状态变为阻塞状态。
  • 劣势:重量级锁会引入线程切换和上下文切换开销,因此性能较低。

synchronizedLock 的区别

特性

synchronized

Lock

实现

JVM 层面实现

Java 代码实现

异常处理

异常时自动释放锁

必须在 finally 块手动释放

响应中断

不支持

支持

锁状态获取

无法判断

可以判断是否成功获取锁

读写效率

不支持读写锁分离

支持,提高读操作效率

总结与适用场景
  • 偏向锁适合 无锁竞争的场景。
  • 轻量级锁适合 低竞争、短时间持有锁的场景。
  • 重量级锁适合 高竞争、长时间持有锁的场景。

这些优化使得 synchronized 的性能大大提升,在大多数场景下可以替代 Lock 使用。而在需要精确控制锁行为时,可以使用 Lock 接口。

希望这份整理对你有帮助!😊

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • synchronized锁升级
  • synchronized 锁的基本用法
    • 锁对象的影响
  • synchronized 的执行机制
  • 锁的优化:从无锁到重量级锁
    • 对象头结构
    • 无锁状态
  • 偏向锁
    • 偏向锁的升级
  • 轻量级锁
  • 重量级锁
  • synchronized 与 Lock 的区别
  • 总结与适用场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档