轻量级锁是什么?轻在哪里?重量级锁是什么?重在哪里?

news2025/4/16 10:35:10

轻量级锁 vs 重量级锁:核心区别与设计哲学

在JVM的锁优化体系中,轻量级锁和重量级锁是两种不同竞争强度下的解决方案。它们的核心差异体现在 资源消耗、适用场景和实现机制 上。以下是详细对比:


一、轻量级锁(Thin Lock)
1. 设计目标

优化场景:针对 低竞争短时间持有锁 的情况(如两个线程交替访问同步块)。
核心思想:通过 CAS自旋 避免线程直接阻塞,减少用户态到内核态的切换开销。

2. 实现原理

锁记录(Lock Record)
线程在栈帧中分配一个Lock Record空间,存储锁对象的Mark Word副本。
CAS竞争
通过CAS操作尝试将锁对象的Mark Word替换为指向Lock Record的指针。
成功:线程获取锁,Mark Word标志位变为轻量级锁(00)。
失败:触发 自旋等待锁膨胀(升级为重量级锁)。

3. "轻"在哪里?
维度轻量级锁原因
资源消耗仅需栈帧中的Lock Record和少量CAS操作不涉及内核态切换,无线程阻塞
性能开销纳秒级自旋(CPU空转)自旋时间短(JDK6后自适应调整),避免上下文切换
适用场景线程交替执行同步块(如短任务、低并发)竞争概率低,自旋成功率高
4. 示例流程
Object obj = new Object();
synchronized (obj) {  // 1. 栈帧创建Lock Record
                      // 2. CAS替换Mark Word
                      // 3. 成功则进入同步块
}

二、重量级锁(Heavyweight Lock)
1. 设计目标

处理高竞争:当多个线程激烈争抢同一锁时(如长时间持有锁或高并发场景)。
核心机制:通过操作系统提供的 互斥量(Mutex)条件变量 实现线程阻塞与唤醒。

2. 实现原理

Monitor对象
每个Java对象关联一个ObjectMonitor(C++实现),包含:
_owner:持有锁的线程
_EntryList:阻塞等待锁的线程队列
_WaitSet:调用wait()的线程队列
内核介入
线程竞争失败后,直接进入阻塞状态(通过pthread_mutex_lock),由操作系统调度唤醒。

3. "重"在哪里?
维度重量级锁原因
资源消耗需要维护ObjectMonitor和内核级线程调度涉及用户态→内核态切换,系统调用开销大
性能开销微秒级线程阻塞与唤醒线程阻塞导致上下文切换(CPU寄存器和堆栈保存/恢复)
适用场景长时间持有锁或高并发竞争(如数据库连接池)自旋代价过高,直接阻塞更高效
4. 示例流程
synchronized (highContentionLock) {  // 1. 竞争失败后加入_EntryList
                                     // 2. 线程被OS挂起
                                     // 3. 锁释放时唤醒等待线程
}

三、关键对比总结
特性轻量级锁重量级锁
锁标志位00(Mark Word中)10(Mark Word中)
竞争处理CAS自旋(用户态)线程阻塞(内核态)
资源占用栈帧中的Lock RecordObjectMonitor+内核队列
性能开销低(自旋消耗CPU周期)高(上下文切换、系统调用)
升级触发条件自旋失败或竞争激烈轻量级锁膨胀或显式调用wait()

四、锁升级的全流程
1. 无锁 → 偏向锁(单线程访问)
   └─ 出现第二个线程 → 撤销偏向锁
2. 轻量级锁(CAS自旋)
   └─ 自旋失败/长时间竞争 → 膨胀为重量级锁
3. 重量级锁(OS互斥量)

五、实际场景与调优建议
  1. 优先使用轻量级锁
    适用场景:短任务、低并发(如局部变量的同步块)。
    调优参数-XX:PreBlockSpin=10(调整自旋次数,JDK6后自适应无需手动设置)。

  2. 避免重量级锁的滥用
    问题:高竞争时频繁阻塞/唤醒会导致性能骤降。
    解决方案
    ◦ 减小锁粒度(如ConcurrentHashMap分段锁)。
    ◦ 改用无锁结构(如AtomicLong)。

  3. 监控锁状态
    工具
    ◦ JOL(Java Object Layout)查看对象头:
    java System.out.println(ClassLayout.parseInstance(obj).toPrintable());
    ◦ JConsole检查锁竞争:监控线程阻塞和等待时间。


总结

轻量级锁的"轻":体现在用户态自旋、低资源占用,适合短暂竞争。
重量级锁的"重":体现在内核态阻塞、高系统开销,应对高并发竞争。
设计哲学:JVM通过锁升级机制(偏向→轻量级→重量级)实现 按需分配资源,平衡性能与安全性。理解这一机制有助于编写高效并发代码,并在性能调优时精准定位锁瓶颈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python赋能量子计算:算法创新与应用拓展

量子计算与Python结合的算法开发与应用研究 摘要 量子计算作为计算机科学的前沿技术,凭借其独特的计算能力在解决复杂问题方面展现出巨大潜力。Python作为一种高效、灵活的编程语言,为量子计算算法的开发提供了强大的支持。本文从研究学者的视角,系统探讨了量子计算与Pytho…

Java学习笔记(多线程):ReentrantLock 源码分析

本文是自己的学习笔记,主要参考资料如下 JavaSE文档 1、AQS 概述1.1、锁的原理1.2、任务队列1.2.1、结点的状态变化 1.3、加锁和解锁的简单流程 2、ReentrantLock2.1、加锁源码分析2.1.1、tryAcquire()的具体实现2.1.2、acquirQueued()的具体实现2.1.3、tryLock的具…

【软考系统架构设计师】系统配置与性能评价知识点

1、 常见的性能指标 主频外频*倍频 主频1/CPU时钟周期 CPI(Clock Per Instruction)平均每条指令的平均时间周期数 IPC(Instruction Per Clock)每时钟周期运行指令数 MIPS百万条指令每秒 MFLOPS百万个浮点操作每秒 字长影响运算的…

解锁Midjourney创作潜能:超详细提示词(Prompts)分类指南

AI生图自由!就来 ChatTools (https://chat.chattools.cn),畅享Midjourney免费无限绘画。同时体验GPT-4o、Claude 3.7 Sonnet、DeepSeek等强大模型。 为了帮助大家更好地驾驭Midjourney,我们精心整理并分类了大量常用且效果出众的提示词。无论…

大模型分布式推理和量化部署

一、小常识 1、计算大模型占用多少显存 对于一个7B(70亿)参数的模型,每个参数使用16位浮点数(等于 2个 Byte)表示,则模型的权重大小约为: 7010^9 parameters2 Bytes/parameter=14GB 70亿个参数每个参数占用2个字节=14GB 所以我们需要大于14GB的显存。注意14GB单纯是大…

【ROS】分布式通信架构

【ROS】分布式通信架构 前言环境要求主机设置(Master)从机设置(Slave)主机与从机通信测试本文示例启动ROS智能车激光雷达节点本地计算机配置与订阅 前言 在使用 ROS 时,我们常常会遇到某些设备计算能力不足的情况。例…

零基础HTML·笔记(持续更新…)

基础认知 HTML标签的结构 <strong>文字变粗</strong> &#xff1c;开始标签&#xff1e;内容&#xff1c;结束标签&#xff1e; 结构说明&#xff1a; 标签由<、>、1、英文单词或字母组成。并且把标签中<>包括起来的英文单词或字母称为标签名。常…

Visual Studio 2022 UI机器学习训练模块

VS你还是太超标了&#xff0c;现在机器学习都不用写代码了吗&#xff01;&#xff01; 右键项目解决方案&#xff0c;选择机器学习模型

FreeRTOS使任务处于阻塞态的API

在FreeRTOS中&#xff0c;任务进入阻塞状态通常是因为等待某个事件或资源。以下是常用的使任务进入阻塞态的API及其分类&#xff1a; 1. 任务延时 vTaskDelay(pdMS_TO_TICKS(ms)) 将任务阻塞固定时间&#xff08;相对延时&#xff0c;从调用时开始计算&#xff09;。 示例&…

独立开发者之网站的robots.txt文件如何生成和添加

robots.txt是一个存放在网站根目录下的文本文件&#xff0c;用于告诉搜索引擎爬虫哪些页面可以抓取&#xff0c;哪些页面不可以抓取。下面我将详细介绍如何生成和添加robots.txt文件。 什么是robots.txt文件&#xff1f; robots.txt是遵循"机器人排除协议"(Robots…

Leedcode刷题 | Day31_贪心算法05

一、学习任务 56. 合并区间代码随想录738. 单调递增的数字968. 监控二叉树 二、具体题目 1.56合并区间56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,1…

猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取

开发背景 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的…

粘性定位(position:sticky)——微信小程序学习笔记

1. 简介 CSS 中的粘性定位&#xff08;Sticky positioning&#xff09;是一种特殊的定位方式&#xff0c;它可以使元素在滚动时保持在视窗的特定位置&#xff0c;类似于相对定位&#xff08;relative&#xff09;&#xff0c;但当页面滚动到元素的位置时&#xff0c;它会表现得…

最新版IDEA超详细图文安装教程(适用Mac系统)附安装包及补丁2025最新教程

目录 前言 一、IDEA最新版下载 二、IDEA安装 三、IDEA补丁 前言 IDEA&#xff08;IntelliJ IDEA&#xff09;是专为Java语言设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发&#xff0c;被公认为业界最优秀的Java开发工具之一。DEA全称Int…

JavaWeb-04-Web后端基础(SpringBootWeb、HTTP协议、分层解耦、IOC和DI)

目录 一、SpringBootWeb入门 1.1 概述 1.2 入门程序 1.2.1 需求 1.2.2 开发步骤 1.3 入门解析 二、HTTP协议 2.1 HTTP概述 2.1.1 介绍 2.1.2 特点 2.2 HTTP请求协议 2.2.1 介绍 2.2.2 获取请求数据 2.3 HTTP响应协议 2.3.1 格式介绍 2.3.2 响应状态码 2.3…

SQLite + Redis = Redka

Redka 是一个基于 SQLite 实现的 Redis 替代产品&#xff0c;实现了 Redis 的核心功能&#xff0c;并且完全兼容 Redis API。它可以用于轻量级缓存、嵌入式系统、快速原型开发以及需要事务 ACID 特性的键值操作等场景。 功能特性 Redka 的主要特点包括&#xff1a; 使用 SQLi…

wkhtmltopdf 实现批量对网页转为图片的好工具,快速实现大量卡片制作

欢迎来到涛涛聊AI 1、需求痛点 在学习当中经常遇到一些知识点&#xff0c;想和大家分享。但只有文本形式&#xff0c;很多人不愿意去阅读&#xff0c;也看不到重点。 如果自己去单独设计页面版式&#xff0c;又太浪费时间。那就想着有没有一种方法&#xff0c;可以把一个知识…

深入解析xDeepFM:结合压缩交互网络与深度神经网络的推荐系统新突破

今天是周日&#xff0c;我来解读一篇有趣的文章——xDeepFM。这篇文章由 Mao et al. 发表在SIGIR 2019会议。文章提出了一个新的网络模型——压缩交互网络&#xff08;CIN&#xff09;&#xff0c;用于显式地学习高阶特征交互。通过结合 CIN 和传统的深度神经网络&#xff08;D…

CST1017.基于Spring Boot+Vue共享单车管理系统

计算机/JAVA毕业设计 【CST1017.基于Spring BootVue共享单车管理系统】 【项目介绍】 共享单车管理系统&#xff0c;基于 Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有四类用户&#xff0c;分别是&#xff1a;监管用户、运营用户、调度用户、普…

vue实现二维码生成器和解码器

vue实现二维码生成器和解码器 1.生成基本二维码&#xff1a;根据输入的value生成二维码。 2.可定制尺寸&#xff1a;通过size调整大小。 3.颜色和背景色&#xff1a;设置二维码颜色和背景。 4.静区&#xff08;quiet zone&#xff09;支持&#xff1a;通过quietZone调整周围的…