当前位置: 首页 > news >正文

偏向锁 / 轻量级 / 重量级、AQS、ReentrantLock、读写锁

一、Synchronized 四种锁状态(无锁→偏向→轻量→重量)

1. 偏向锁

核心:偏向第一个拿到锁的线程,无竞争直接拿锁

  • 触发:单线程无竞争场景
  • 原理:MarkWord 记录线程 ID,下次直接进入,无 CAS 开销
  • 撤销:出现第二个线程竞争,升级为轻量级锁
  • 开启:JDK1.6 默认开启,JDK15 后默认关闭

2. 轻量级锁

核心:多线程交替执行,不存在同时竞争

  • 原理:自旋 CAS 抢锁,不阻塞
  • 优点:用户态执行,不进入内核,速度快
  • 缺点:自旋消耗 CPU
  • 升级:自旋失败→升级重量级锁

3. 重量级锁

核心:多线程激烈竞争

  • 原理:向操作系统申请内核态互斥锁
  • 未抢到锁线程阻塞休眠,让出 CPU
  • 开销最大,性能最低,并发量大必走它

状态升级顺序

无锁 → 偏向锁 → 轻量级锁 → 重量级锁只能升级,不能降级

三者核心区别

  1. 偏向锁:单线程独享,零 CAS
  2. 轻量级锁:交替执行,自旋 CAS
  3. 重量级锁:并发争抢,内核阻塞

二、AQS 抽象队列同步器(锁底层核心)

1. 作用

Java 所有 JUC 锁的底层基石ReentrantLock、读写锁、CountDownLatch、Semaphore 全靠 AQS 实现

2. 核心结构

  1. state 同步状态变量(int)
    • 0:无锁
    • 0:已加锁(可重入次数)

  2. CLH 双向阻塞队列抢锁失败线程入队排队,等待唤醒
  3. 两大核心模式
    • 独占锁:同一时间只能一个线程拿锁(ReentrantLock)
    • 共享锁:多线程同时拿锁(读写锁、CountDownLatch)

3. 核心方法

  • tryAcquire ():尝试获取独占锁
  • tryRelease ():释放独占锁
  • tryAcquireShared ():获取共享锁
  • tryReleaseShared ():释放共享锁

三、ReentrantLock 可重入独占锁

1. 对比 synchronized

  • 相同:可重入
  • 不同:
    1. 手动加锁解锁:lock() / unlock()
    2. 支持公平锁 / 非公平锁
    3. 可中断等待、超时抢锁
    4. 底层基于AQS

2. 两种模式

java

运行

// 非公平锁(默认):插队抢锁,吞吐量高 new ReentrantLock() // 公平锁:严格排队,先来先得 new ReentrantLock(true)

3. 可重入原理

state 记录重入次数,加锁 + 1,解锁 - 1,归 0 才算真正释放锁。

4. 标准写法

java

运行

lock.lock(); try { // 业务代码 } finally { lock.unlock(); // 必须finally释放 }

四、读写锁 ReentrantReadWriteLock

1. 设计思想

读多写少场景专用

  • 读锁(共享锁):多个线程同时读,并发高
  • 写锁(独占锁):写时独占,禁止读写

2. 四大互斥规则

  1. 读与读:共存
  2. 读与写:互斥
  3. 写与读:互斥
  4. 写与写:互斥

3. 适用场景

缓存、配置文件、商品库存、查询远大于修改

4. 缺点

容易出现写饥饿:大量读线程一直占锁,写线程一直等待

5. 升级版

StampedLock:乐观读锁,解决写饥饿,性能更强


面试极简背诵版

  1. Synchronized 锁膨胀:偏向→轻量→重量,单向升级不可降级
  2. 偏向锁:单线程优化;轻量级:自旋无阻塞;重量级:内核阻塞
  3. AQS:JUC 锁底层,靠 state+CLH 队列实现排队抢锁
  4. ReentrantLock:AQS 实现,可重入、公平非公平、手动锁
http://www.jsqmd.com/news/848920/

相关文章:

  • 电网形成逆变器与保护继电器的交互机制及优化方案
  • 避坑指南:RK3566给GC2053提供MCLK,分压电阻怎么选?实测波形告诉你答案
  • 机器学习中的过拟合与欠拟合:如何解决模型泛化问题
  • 避坑指南:用3dMax一键房屋插件时,为什么你的窗洞总创建失败?
  • 2026年4月做得好的精神堡垒制作厂家推荐,城市道路标志牌/公路标志牌/形象墙导视牌/精神堡垒,精神堡垒制作商哪个好 - 品牌推荐师
  • 为什么你的Perplexity搜索总返回噪音结果?7步精准提示工程诊断流程
  • 别再让CUDA‘偷懒’了!实测NVIDIA控制面板这3个设置,让YOLOv5推理速度翻倍
  • 完整 Ubuntu 服务器 XFCE 桌面 + XRDP 远程桌面 部署使用全流程
  • 别再手动画框了!用CVAT的自动标注和插值功能,10分钟搞定一段视频标注
  • 从CVE到ATTCK:如何用Elastic Stack构建你的个人安全情报仪表盘
  • 题解:2026 JSCPC D
  • 2026四川园区照明工程品牌排行:场馆照明设计方案/无主灯照明/景观照明工程/3家标杆企业全维度解析 - 优质品牌商家
  • ArcGIS新手避坑指南:批量拼接栅格时,Mosaic和Mosaic To New Raster到底该选哪个?
  • 8051中断向量冲突与Keil调试问题解决方案
  • 【Perplexity营养饮食查询实战指南】:3大隐藏技巧让AI精准解读膳食需求并生成个性化食谱
  • 别再手动装tools.jar了!Maven项目报错‘无法解析jdk.tools’的三种正确解法(附JDK版本选择建议)
  • 2026年性价比高、排名靠前的智慧文旅机构究竟有哪些?
  • STM32WL55实战:用CAD模式实现超低功耗LoRa监听,电池寿命翻倍不是梦
  • 大模型应用开发:从需求分析到上线的全流程指南
  • Perplexity搜索效率提升73%的6个隐藏技巧:资深AI分析师亲测有效
  • 泰安首饰回收商家实测评测:核心维度对比解析 - 优质品牌商家
  • 别再死记硬背了!用这两个真实案例,带你彻底搞懂MATLAB linprog函数的参数怎么填
  • GAMES101图形学笔记:从光栅化到路径追踪,我的自学避坑路线图
  • 树莓派I2C保姆级教程:从命令行工具到Python脚本,一次搞定多个传感器(附避坑指南)
  • 不想学Java/Kotlin?用Python+BeeWare快速做个爬虫展示App(从写代码到装手机)
  • 揭秘Perplexity内部薪资结构:3大查询技巧+5个隐藏API接口,90%开发者还不知道
  • 量子计算如何革新机器翻译:QEDACVC系统解析
  • 《CVPR2025-DEIM创新改进项目实战:从原理到部署的深度学习优化全攻略》001、DEIM算法背景与CVPR2025前沿趋势解读
  • NeuroSim V1.5:CIM加速器基准测试框架解析
  • 告别卡顿!手把手教你用OBS+保利威PRTC插件实现400毫秒超低延迟直播(附iOS/安卓/PC实测数据)