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

Java锁的升级流程详解:无锁、偏向锁、轻量级锁、重量级锁

在Java中,为了在多线程并发场景下既保证线程安全,又尽可能提高性能,JVM针对synchronized实现了锁的优化升级机制。
锁可以从无锁逐步升级到偏向锁、轻量级锁,最后是重量级锁。
话不多说,发车!

一、无锁(Unlocked)

无锁,顾名思义,表示对象处于未加锁状态。
特点:对象正常状态,没有线程竞争。
适用场景:对象没有被任何线程加锁的情况下,大家可以自由访问。
性能:最快,不需要任何同步开销。
在jdk1.6之后默认是开启的

二、偏向锁(Biased Lock)

偏向锁是JDK 1.6引入的一种锁优化手段。
它假设大部分情况下,锁都是由同一个线程持有的,所以不做真正的同步操作,只在对象头中记录线程ID。
加锁流程:
第一个线程访问时,JVM会偏向该线程,记录它的线程ID。
后续该线程进入同步块时,只需快速判断对象头是否偏向自己即可,无需CAS或其他同步。
->什么时候会变成轻量级锁呢?
如果有另一个线程也尝试访问该对象,偏向锁会被撤销,进入轻量级锁阶段。

三、轻量级锁(Lightweight Lock)

轻量级锁是为了优化低竞争场景下的性能开销。
它通过CAS(Compare-And-Swap)操作,避免线程挂起和唤醒。
加锁流程:
线程在自己的栈帧中创建锁记录(Lock Record)。
尝试通过CAS,将对象头Mark Word指向自己的锁记录。
成功 → 轻松拿到锁。
失败(有竞争) → 可能膨胀为重量级锁。
解锁流程:
使用CAS把对象头恢复到原状态。
如果在锁期间没有其他线程参与竞争,解锁非常快。

四、重量级锁(Heavyweight Lock)

重量级锁是最传统、最可靠的锁机制,也叫做Monitor锁。
一旦竞争激烈,轻量级锁无法维持,就会膨胀成重量级锁。
加锁流程:
线程在获取锁失败后,挂起自己,进入阻塞状态。
等待持有锁的线程释放后,再重新被唤醒,竞争锁资源。

最后附上一张图,锁的升级流程
在这里插入图片描述

相关文章:

  • YUM/DNF管理工具
  • 用vite动态导入vue的路由配置
  • 递归、搜索和回溯算法《递归》
  • 飞凌嵌入式T527核心板获得【OpenHarmony生态产品兼容性证书】
  • window 图形显示驱动-在 WDDM 1.2 中提供无缝状态转换(下)
  • 关于健身房管理系统前后端软件开发主要功能需求分析
  • 《Astro 3.0岛屿架构让内容网站“脱胎换骨”》
  • RISCV学习(5)GD32VF103 MCU架构了解
  • 【AI News | 20250428】每日AI进展
  • transformer-实现单层encoder_layer
  • VINS-FUSION:跑通手机录制数据
  • C语言----操作符详解(万字详解)
  • 4月28日日记
  • 待验证---Oracle 19c 在 CentOS 7 上的快速安装部署指南
  • C#与SVN的深度集成:实现版本控制自动化管理​
  • MATLAB实现神经网络的OCR识别
  • Web 基础与 HTTP 协议
  • STM32的SysTick
  • 学成在线。。。
  • 【爬虫】码上爬第2题:headersi请求头验证
  • 中国纪检监察报刊文:要让劳动最光荣成为社会的崇高风尚
  • 新任海南琼海市委副书记陈明已主持市政府党组全面工作
  • 公交公司须关注新出行需求:“单车巴士”能否常态化
  • QFII一季度现身超300家公司:持有南京银行市值最高,5家青睐立航科技
  • 六部门:进一步优化离境退税政策扩大入境消费
  • 哈马斯同意释放剩余所有以方被扣押人员,以换取停火五年