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

JAVA并发——synchronized的实现原理

synchronized 实现原理依赖于JVM 的 Monitor(监视器锁)和对象头(Object Header)当 synchronized 修饰在方法或代码块上时,会对特定的对象或类加锁,从而确保同一时刻只有一个线程能执行加锁的代码块。

synchronized 修饰方法:会在方法的访问标志中增加一个 ACCSYNCHRONIZED 标志。每当一个线程访问该方法时 JVM 会检查方法的访问标志。如果包含 ACCSYNCHRONIZED 标志,线程必须先获得该方法对应的对象的监视器锁(即对象锁),然后才能执行该方法,从而保证方法的同步性。

synchronized 修饰代码块:会在代码块的前后插入 monitorenter和 monitorexit 字节码指令。可以把 monitorenter 理解为加锁,monitorexit 理解为解锁。

总结:synchronized 是 Java 提供的内置锁(又叫 Monitor锁),底层通过 JVM 的对象头(Mark Word)+ Monitor 对象 实现互斥。它的编译结果中包含字节码指令 monitorenter 和 monitorexit,由 JVM 执行锁逻辑。

1、synchronized 的实现依赖三大底层核心:

组成作用
Mark Word(对象头)存储锁状态(无锁、偏向锁、轻量锁、重量锁等)
Monitor(监视器锁)用于加锁/解锁的 JVM 内部结构,依赖 OS Mutex 实现重量级锁
字节码指令monitorentermonitorexit 负责加锁/释放

2、对象头(Object Header)

在 JVM 中,每个对象的内存布局主要由两部分组成:

  1. Mark Word:用于存储对象的运行时数据,包括锁状态、哈希码、GC 分代信息等。
  2. Class Pointer:指向对象的类型元数据,帮助 JVM 确定对象的类型信息。

3、Mark Word

Mark Word 是对象头的一部分,会根据锁的不同状态保存不同信息是。也是实现 synchronized 的关键,因为它会根据锁的状态保存不同的信息。

具体包括:

  1. 未锁定状态:Mark Word 存储对象的哈希码和 GC 分代信息。
  2. 偏向锁状态:Mark Word 保存获取该锁的线程 ID和一些偏向锁标志位。在没有锁竞争的情况下,锁总是“偏向”于第一个获得它的线程。偏向锁通过减少不必要的 CAS 操作来提高性能。
  3. 轻量级锁状态:Mark Word 存储的是指向栈中锁记录的指针。轻量级锁适用于多个线程短时间内争用同一锁的场景。
  4. 重量级锁状态:Mark Word 存储的是指向 Monitor 对象的指针。当锁竞争激烈时,JVM 会升级为重量级锁,重量级锁使用操作系统的互斥量(Mutex)机制来实现线程的阻塞与唤醒。

4、锁升级总结:

  1. 偏向锁:当一个线程第一次获取锁时,J会将该线程标记为“偏向”状态,后续若该线程再获取该锁,几乎没有开销。
  2. 轻量级锁:当另一个线程尝试获取已经被偏向的锁时,锁会升级为轻量级锁,使用 CAS 操作来减少锁竞争的开销。
  3. 重量级锁:当 CAS失败无法获取锁,锁会升级为重量级锁,线程会被挂起,直到锁被释放。

5、synchronized 优缺点

✅ 优点

  • JVM 原生支持,代码清晰,语义明确;
  • 安全可靠,能保证原子性 + 可见性;
  • 随着 JDK 优化,性能越来越好(偏向锁、轻量锁加持);

❌ 缺点

  • 粒度粗:只能整个方法或代码块上锁;
  • 无法中断锁请求;
  • 不灵活:不支持公平/非公平、超时等待等(相比 Lock)
http://www.lryc.cn/news/587351.html

相关文章:

  • 特征选择方法
  • 一文打通MySQL任督二脉(事务、索引、锁、SQL优化、分库分表)
  • GraphRAG Docker化部署,接入本地Ollama完整技术指南:从零基础到生产部署的系统性知识体系
  • AEC线性处理
  • 【iOS】方法与消息底层分析
  • 【设计模式】命令模式 (动作(Action)模式或事务(Transaction)模式)宏命令
  • phpMyAdmin:一款经典的MySQL在线管理工具又回来了
  • 【RA-Eco-RA6E2-64PIN-V1.0 开发板】ADC 电压的 LabVIEW 数据采集
  • 第一个Flink 程序 WordCount,词频统计(批处理)
  • git实操
  • 鸿蒙项目构建配置
  • 区分三种IO模型和select/poll/epoll
  • Java设计模式之行为型模式(命令模式)
  • Spring Boot + MyBatis 实现用户登录功能详解(基础)
  • JAVA学习笔记 JAVA开发环境部署-001
  • 深入分析---虚拟线程VS传统多线程
  • 力扣刷题记录(c++)09
  • 在 OCI 生成式 AI 上搭一个「指定地区拉面店 MCP Server」——从 0 到 1 实战记录
  • opencv中contours的使用
  • 【设计模式】策略模式(政策(Policy)模式)
  • Java小白-设计模式
  • Java 接口 剖析
  • 操作系统-第四章存储器管理和第五章设备管理-知识点整理(知识点学习 / 期末复习 / 面试 / 笔试)
  • 什么是渐进式框架
  • 什么时候会用到 concurrent.futures?要不要背?
  • 17.使用DenseNet网络进行Fashion-Mnist分类
  • 2024CVPR:Question Aware Vision Transformer for Multimodal Reasoning介绍
  • Action-Agnostic Point-Level Supervision for Temporal Action Detection
  • 【读书笔记】《Effective Modern C++》第4章 Smart Pointers
  • 从零开始学习深度学习—水果分类之PyQt5App