前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【高薪程序员必看】万字长文拆解Java并发编程!(4-2):悲观锁底层原理与性能优化实战

【高薪程序员必看】万字长文拆解Java并发编程!(4-2):悲观锁底层原理与性能优化实战

作者头像
摘星.
发布于 2025-05-20 06:25:59
发布于 2025-05-20 06:25:59
3900
代码可运行
举报
文章被收录于专栏:博客专享博客专享
运行总次数:0
代码可运行
Hello大家好!👋 我是摘星✨,今天我们来深度拆解Java并发编程中最经典的​「悲观锁」🔒设计。

在多线程环境下,当你的转账操作被重复提交💸、库存被超卖📉、计数器结果离奇错误❌时,背后往往是因为缺乏合理的锁控制。而悲观锁作为Java并发中最「简单粗暴」的解决方案,从JDK1.0时代的重量级锁⛓️,到如今JVM层级的锁升级优化⚡,其底层实现堪称一部高性能并发的发展史📜

本文将带你穿透**synchronized关键字**的表面语法,直击三大核心问题💡:

  1. ​**🤔 为什么悲观锁能保证线程安全?**​(从Java对象头到Monitor的硬件级协作)
  2. ​**⚡ JDK1.6后synchronized如何实现性能飞跃?**​(偏向锁/轻量级锁的取舍智慧)
  3. ​**🚫 高并发场景下如何规避锁的性能陷阱?**​(从字节码层面理解锁膨胀的条件)

📌 举个真实案例:某电商平台在秒杀活动中使用synchronized导致TPS从8000📈暴跌到300📉,最终通过缩小锁粒度+锁分离优化提升15倍性能🚀——我们将在文中用代码还原这个优化过程。

下面我们直接切入正题,从操作系统与JVM的协作契约🤝开始讲起!

4.5. 锁记录

锁记录(Lock Record)是jvm用来支持轻量级锁的数据结构,是线程私有的,用于记录锁的状态,锁拥有者的信息以及竞争情况等等.

  1. 指向拥有者的指针(Owner Pointer):记录当前拥有锁的线程ID。在加锁的过程中,将对象头部的指针指向锁记录,以便快速定位拥有锁的线程。
  2. 标记位(Displacement):记录了对象头部的偏移量,用于在解锁的过程中恢复对象头部的标记字段。
  3. 锁状态(Lock State):记录了当前线程锁的状态,包括偏向锁、轻量级锁、重量级锁等。

在竞争情况下,多个线程会通过锁记录进行协调,实现了对轻量级锁的竞争和重量化的升级。当多个线程竞争同一把锁时,会通过锁记录中的信息协调竞争关系,避免无谓的自旋和竞争。

4.6. 偏向锁

偏向锁:当没有没有锁竞争时可以用偏向锁来优化

偏向锁的加锁过程:

  • 偏向锁加锁:当线程第一次访问的同步代码块时,jvm会将该对象的锁标记为偏向锁01,同时将对象头中的mark word指向线程ID
  • 偏向锁检查:当线程再次访问同一个加锁对象的synchronized(obj)代码块时,会先检查该对象的锁标记是否为偏向锁,是偏向锁且线程ID与当前线程ID一致,则无需加锁,直接进入代码块

偏向锁撤销过程:

  • 当其他线程访问这个同步代码块时,发现线程ID不一致,偏向锁就会被撤销,升级为轻量级锁
  • 调用wait/notify方法是也会撤销偏向锁,因为wait/notify方法只有重量锁才有

4.7. 轻量级锁

轻量级锁:如果有多个线程使用synchronized对一个对象加锁,但是加锁的时间是错开的,不会发生竞争时,可以使用轻量级锁来优化.

代码语言:javascript
代码运行次数:0
运行
复制
static final Object obj = new Object();
public static void method1(){
    synchronized(obj){
        method2()
    }
}
public static void method2(){
    synchronized(obj){

    }
}

轻量级锁的加锁过程:

  1. 检测偏向锁:线程进入同步代码块时,首先会尝试偏向锁,如果对象的对象头中的锁标识位是01(偏向锁),且当前线程是偏向锁的拥有者,则直接进入同步代码块执行,不需要加轻量级锁.如果对象没有偏向锁,则会进入下一步CAS操作尝试获取轻量级锁.
  2. CAS操作尝试获取轻量级锁:线程进入同步代码块时会尝试通过CAS操作将对象头的markword指向锁记录
    • CAS成功:当前线程成功获取了轻量级锁,对象锁标识位更新为00(轻量级锁)
    • CAS失败-竞争:说明有其他线程也在竞争该对象锁,那么当前线程会进行自旋,尝试在短时间内快速获取锁
    • CAS失败-重入:说明当前线程执行了一次加锁过程,会添加一条锁记录

轻量级锁的解锁过程:

  1. CAS操作尝试释放轻量级锁:当持有轻量级锁的线程退出同步块时,会尝试通过CAS操作将对象头中的markword恢复
    • CAS成功:当前线程成功释放了轻量级锁m对象锁标识位更新为01(无锁状态),同时重置锁记录
    • CAS失败:说明有其他线程正在竞争锁,此时轻量级锁会膨胀为重量级锁

4.8. 锁膨胀

轻量级锁竞争:当前线程加轻量级锁的CAS操作失败时,说明发生了锁的竞争,这时当前线程会进行自旋获取锁.自旋是通过忙等待,在一个循环中不断获取锁

自旋锁膨胀为重量级锁:当自旋达到一定的阈值时,会导致锁膨胀,将轻量级锁膨胀为重量级锁

  1. 当前线程为加锁对象申请Monitor锁,将对象头中的markword指向Monitor地址,锁标识位改为10
  2. 当前线程进入EntryList中,处于阻塞状态
  3. 当持锁的线程退出同步代码块时,尝试用CAS操作将对象头中的markword恢复
    • CAS成功:成功释放锁
    • CAS失败:进入重量级锁的解锁过程,将Monitor的owner清空,并将EntryList中阻塞的线程唤醒来竞争锁

4.9. ReentrantLock

4.9.1. ReentrantLock与synchronized的对比

在Java多线程中,ReentrantLock是一个可重入锁,相比与synchronized有更多的灵活性

共同点:

  • 可重入:ReentrantLock和synchronized都是可重入锁,即对一个对象反复加锁

不同点:

  • 锁等待可终止:ReentrantLock允许一个线程在等待锁的过程中被其他线程打断,然后可以选择继续等待获取终止.synchronized获取锁的过程中是不可被打断的
  • 超时时间:ReentrantLock允许设置获取锁的超时时间,超过时间之后可以放弃获取这个锁.synchronized不能设置超时时间
  • 公平锁选择:ReentrantLock允许选择公平锁或者非公平锁.synchronized只有非公平锁
    • 在公平锁模式下,等待时间最长的线程将优先获取锁的访问权限,按先入先得的方式,防止饥饿现象出现,但是会降低并发度
    • 在非公平锁模式下,让等待中的线程竞争锁,具有随机性
  • 多个条件变量:ReentrantLock提供了Condition允许多个条件变量存在,也就是多个waitlist,可以让线程满足某个条件时等待,也可以让其他线程满足某个条件时唤醒.synchronized只有一个条件变量
  • synchronized是关键字级别,ReentrantLock是对象级别
4.9.2. API介绍

private Lock lock = new ReentrantLock()

  • lock.lock():获取锁,不可被打打断
  • lock.unlock():释放锁
  • lock.lockInterruptibly():可打断,获取锁:获取锁失败进入阻塞状态时,可以被其他线程的interrput方法打断
  • lock.trylock():尝试获得锁,返回值是boolean,true获取锁成功,false获取锁失败
  • lock.trylock(long n,TimeUnit.SECONDS):尝试获得锁,获取不到锁等待n单位时间,时间到了还没获取到锁就返回false,时间内获取到锁还是返回true,支持可打断
  • new ReentrantLock(true):设置公平锁,默认为false

Condition condition = lock.newCondition()//Condition可以创建多个也就是支持多个条变量

  • condition.await():await使用前需要获取锁,调用后释放锁,进入condition条件变量中等待,被唤醒(打断)后继续竞争lock锁,竞争成功后继续执行
  • condition.await(long timeout,TimeUnit unit):等待指定超时时间
  • condition.signal():从condition中随机唤醒一个等待中的线程
  • condition.signalAll():从condition中唤醒全部等待中的线程
  • condition.awaitUninterruptibly():等待不可被打断
代码语言:javascript
代码运行次数:0
运行
复制
try {
    // 获取锁 : 不可被打断
    lock.lock(); 
    // 在这里执行需要同步的代码块
} finally {
    // 释放锁
    reentrantLock.unlock(); 
}
🎯 悲观锁总结:从原理到实战的完整指南 🔒➡️⚡
🔍 核心要点回顾
  1. 悲观锁哲学 🛡️
  • "宁可错杀,不可放过"的设计理念
  • 适合写多读少场景(支付/库存系统💰)
  1. synchronized进化史 🧬
  • JDK1.6前:重量级锁⛓️(微秒级延迟)
  • JDK1.6后:锁升级路径(无锁→偏向锁→轻量级锁→重量级锁)
  1. 关键对比 ⚖️

特性

synchronized

ReentrantLock

条件变量

单个

多个

可中断

超时控制

公平锁

💡​场景选择指南 🗺️
  • 简单场景 → synchronized(自动管理)
  • 复杂需求 → ReentrantLock(超时/公平锁)
  1. 性能监控工具 🔧
  • 使用JOL查看对象头:System.out.println(ClassLayout.parseInstance(obj).toPrintable())
  • Arthas监控锁竞争:monitor -c 5 com.example.MyClass methodName
🚀 进阶路线
  1. 下篇预告 📢
  • 无锁编程:CAS原理揭秘
  • Atomic类性能对比
  1. 思考挑战 💭 当QPS超过10万时:
  • 偏向锁是否反而降低性能?
  • 如何选择自旋次数阈值?
📚 扩展学习
  1. 推荐书籍
  • 《Java并发编程实战》📖
  • 《并发编程的艺术》🎨
  1. 实战项目
  • 实现一个带性能统计的锁装饰器
  • 对比不同锁在秒杀场景的表现
🌟 一句话总结

"悲观锁用性能换取安全,而真正的艺术在于找到那个平衡点⚖️"

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
网络安全宣传周 - 手机充电桩数据泄露
在当今数字化时代,手机已成为人们生活中不可或缺的一部分。随着手机使用频率的增加,对手机充电的需求也日益增长。手机充电桩作为一种便捷的充电方式,广泛分布于公共场所如商场、机场、车站等。然而,近年来,手机充电桩数据泄露事件频繁发生,给用户的个人信息安全带来了严重威胁。本研究报告旨在深入分析手机充电桩数据泄露的原因、危害及防范措施,以提高用户对手机充电桩数据安全的认识,保障用户的个人信息安全。
Khan安全团队
2024/09/01
2060
网络安全宣传周 - 信息资产盗窃
(一)定义 信息资产盗窃是指未经授权的个人或组织通过网络手段获取、篡改或破坏他人信息资产的行为。
Khan安全团队
2024/11/02
1660
网络安全宣传周 - 社交网络
社交网络的兴起改变了人们的沟通方式和生活模式。它为人们提供了便捷的交流平台,使人们能够轻松地与朋友、家人和同事保持联系,分享生活点滴和信息。然而,社交网络的开放性和互动性也使其成为网络犯罪分子的目标,给用户的个人信息安全、财产安全和社会稳定带来了严重威胁。因此,研究网络安全中社交网络的问题具有重要的现实意义。
Khan安全团队
2024/10/04
1970
网络安全宣传周 - 社会工程
社会工程在网络安全领域正扮演着愈发重要的角色,成为网络安全的新挑战。研究表明,91% 的网络攻击是通过社会工程手段完成的。社会工程攻击利用人类的心理弱点和社交行为,绕过传统的技术防护措施,对个人、企业和国家的网络安全构成严重威胁。例如,常见的网络钓鱼攻击,伪装成银行、学校、软件公司或政府安全机构等可信服务提供者,要求用户提供相关信息,大多数的钓鱼攻击都是通过这种方式获取用户的敏感信息。西工大钓鱼邮件攻击事件就是一个典型的例子,黑客通过以 “科研评审、答辩邀请和出国通知” 为主题的钓鱼邮件,邮件内含木马程序,引诱部分师生点击链接,非法获取师生电子邮箱登录权限,致使相关邮件数据被窃取。
Khan安全团队
2024/11/02
2000
网络安全宣传周 - 网络摄像头窃密
随着物联网技术的快速发展,网络摄像头在家庭、企业、公共场所等各个领域得到了广泛应用。然而,这些摄像头也成为了网络攻击的潜在目标,其权限和信号可能被黑客获取,导致隐私泄露和安全隐患。
Khan安全团队
2024/08/18
3580
网络安全宣传周 - 网络后门
随着信息技术的飞速发展,网络安全面临的挑战日益严峻。网络后门作为一种隐蔽的攻击手段,给个人、企业和国家带来了严重的安全威胁。近年来,出现了一种利用特制鼠标创建网络后门的新型攻击方式,值得我们高度关注和深入研究。
Khan安全团队
2024/08/17
1180
网络安全宣传周 - Web 浏览数据截获
随着互联网的普及和发展,Web 浏览已成为人们获取信息、进行交流和开展业务的重要方式。然而,在使用公共 Wi-Fi 网络时,用户的 Web 浏览数据面临着被截获的风险,这给个人隐私和信息安全带来了严重的威胁。
Khan安全团队
2024/08/18
1770
网络安全宣传周 - 银行卡盗刷
随着信息技术的飞速发展,网络已经深入到人们生活的各个方面。在享受网络带来便利的同时,网络安全问题也日益凸显。其中,盗刷银行卡作为一种严重的网络安全犯罪行为,给个人、金融机构和社会带来了巨大的损失。本研究报告旨在深入分析网络安全中盗刷银行卡的现状、原因、危害及防范措施,为保障网络安全和金融安全提供参考。
Khan安全团队
2024/09/01
1470
网络安全宣传周 - 短信植入木马
在当今数字化时代,手机已成为人们生活中不可或缺的通信工具。然而,短信植马这一恶意手段正悄然威胁着用户的手机安全。用户一旦点击手机短信中的恶意链接,下载并安装隐含木马程序的 APP,手机就可能被植入木马,从而导致个人信息泄露、财产损失等严重后果。
Khan安全团队
2024/08/18
3560
网络安全宣传周 - LED 灯光窃密
在当今高度信息化的社会中,信息安全的重要性日益凸显。随着技术的不断发展,新的窃密手段层出不穷,LED 灯光窃密作为一种相对较新且不易察觉的方式,给信息保护带来了新的挑战。
Khan安全团队
2024/08/18
2410
网络安全宣传周 - 网页挂马
随着互联网的普及和发展,网页成为人们获取信息、进行交流和开展业务的重要平台。然而,一些不法分子利用网页挂马技术,将恶意代码嵌入正常网页,给用户的计算机安全带来了严重威胁。
Khan安全团队
2024/08/18
3890
网络安全宣传周 - 无线键盘输入截获与信息窃取
随着无线技术的广泛应用,无线键盘为用户带来了便捷的操作体验。然而,这种便捷性也伴随着潜在的安全风险。无线键盘输入截获成为了一种不容忽视的网络攻击手段,对个人隐私和信息安全构成了严重威胁。
Khan安全团队
2024/08/17
2420
网络安全宣传周 - 利用钓鱼 WiFi 窃取微信朋友圈私人信息
随着智能手机的普及和社交媒体的广泛应用,人们在享受便捷的网络服务时,个人隐私信息也面临着越来越多的威胁。黑客利用钓鱼 WiFi 窃取用户微信朋友圈等私人信息的行为,给用户带来了极大的安全隐患。
Khan安全团队
2024/08/18
3860
网络安全宣传周 - 钓鱼邮件安全
在当今数字化时代,电子邮件已成为人们进行信息交流和业务往来的重要工具。然而,钓鱼邮件的出现给网络安全带来了严重挑战。钓鱼邮件通常伪装成合法的机构或个人,通过欺骗用户点击链接、下载附件或提供敏感信息,从而窃取用户的个人数据、财务信息或企业机密。因此,了解钓鱼邮件的特点和防范措施对于保护个人和企业的网络安全至关重要。
Khan安全团队
2024/09/05
2190
网络安全宣传周 - 个人信息保护
在当今数字化时代,个人信息的价值不断提升。从姓名、身份证号码到银行账户、医疗记录等,这些信息涵盖了个人生活的各个方面。然而,网络的开放性和复杂性使得个人信息面临着诸多安全风险。个人信息泄露不仅会给个人带来经济损失和精神困扰,还可能对社会稳定和国家安全造成威胁。因此,加强网络安全中个人信息保护至关重要。
Khan安全团队
2024/10/04
1890
网络安全宣传周 - 投影仪窃密
随着科技的不断发展,信息安全面临着越来越多的挑战。投影仪作为一种常见的办公和演示设备,其安全性往往容易被忽视。在普通投影仪中植入窃取装置,能够将投影内容等图像信息传送到控制端,从而导致严重的信息泄露风险。
Khan安全团队
2024/08/18
2530
网络安全宣传周 - 电信诈骗
电信诈骗在网络安全领域已成为一颗毒瘤,严重威胁着人们的财产安全和社会的稳定。据统计,近年来电信网络诈骗犯罪持续呈现高发态势,犯罪形式多达 48 类。电信诈骗不仅会让个人遭受巨大的经济损失,还会扰乱正常的生产生活秩序。例如,刘女士在交友 APP 上被诈骗 50 余万元,王女士也因交友诈骗损失数万元。这些案例充分说明电信诈骗危害巨大,网络安全形势极为严峻。
Khan安全团队
2024/11/02
1760
网络安全宣传周 - 植入木马
微信作为当前最主流的社交应用之一,承载着大量的个人和工作信息。然而,随着移动互联网的发展,微信窃密问题日益凸显,给用户的隐私和信息安全带来了巨大威胁。
Khan安全团队
2024/08/18
2020
【安全科普】从“微信文件助手隐私泄漏”看社交平台网络安全
随着互联网技术的飞速发展,社交平台已经成为了人们日常生活中不可或缺的一部分。人们通过社交平台与亲朋好友保持联系,分享生活点滴,获取资讯信息。然而,与此同时,社交平台上的网络安全风险也日益凸显。近期,一起因微信好友改名为“文件传输助手”而导致的长达九年的隐私泄露事件,再次引起了公众对社交平台网络安全的关注。本文将从网络安全的角度,分析社交平台上可能的安全风险,并提出详细的防范措施。
星尘安全
2024/10/14
2210
【安全科普】从“微信文件助手隐私泄漏”看社交平台网络安全
网络安全宣传周 - 网络诈骗
当前,网络诈骗呈现出高发态势,已成为严重威胁社会稳定的一大难题。从个人层面来看,网络诈骗给受害者带来了巨大的经济损失和心理创伤。许多人辛苦积攒的钱财被骗子瞬间骗走,甚至可能导致家庭破裂。例如,一些老年人因轻信网络诈骗分子的虚假宣传,将养老钱投入到所谓的 “高回报” 投资项目中,结果血本无归。对于企业而言,网络诈骗也带来了诸多风险。企业可能因员工遭受网络诈骗而导致重要商业信息泄露,影响企业的正常运营和竞争力。据统计,每年因网络诈骗导致的企业经济损失高达数十亿。在社会经济层面,网络诈骗严重扰乱了市场经济秩序。骗子通过各种手段骗取钱财,使得资金无法正常流动,影响了经济的健康发展。
Khan安全团队
2024/11/02
1800
推荐阅读
相关推荐
网络安全宣传周 - 手机充电桩数据泄露
更多 >
目录
  • 4.5. 锁记录
  • 4.6. 偏向锁
  • 4.7. 轻量级锁
  • 4.8. 锁膨胀
  • 4.9. ReentrantLock
    • 4.9.1. ReentrantLock与synchronized的对比
    • 4.9.2. API介绍
    • 🎯 悲观锁总结:从原理到实战的完整指南 🔒➡️⚡
      • 🔍 核心要点回顾
      • 💡​场景选择指南 🗺️
      • 🚀 进阶路线
      • 📚 扩展学习
      • 🌟 一句话总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档