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

【并发编程】synchronized 的底层原理

在Java中,synchronized关键字用于在多个线程之间确保共享资源的同步访问。其背后的实现涉及复杂的锁优化机制,如偏向锁、轻量级锁和重量级锁(也称作膨胀锁)。我们将简要介绍这些概念及其底层实现。

锁的优化过程

Java虚拟机对锁的实现进行了许多优化,以提高性能。主要有以下几种锁状态:

  1. 无锁状态

    • 当对象未被任何线程锁定时,处于无锁状态。
  2. 偏向锁

    • 偏向锁的设计目的是减少同一个线程多次获得锁的代价。
    • 当一个线程访问同步块并获取锁时,锁会记录这个线程ID,并处于偏向锁状态。
    • 如果该线程再次进入这个同步块,无需进行同步操作,只需检查偏向锁的标记即可。
    • 如果另一个线程尝试获取此锁,则偏向锁会被撤销,并根据情况升级为轻量级锁或重量级锁。
  3. 轻量级锁

    • 轻量级锁在偏向锁被多个线程访问时,通过自旋锁的方式进行多线程竞争。
    • 线程在进入同步块时,如果对象处于无锁状态,会在当前线程栈帧中创建一个锁记录拷贝,然后尝试用CAS操作把对象头中的Mark Word更新为指向锁记录的指针。
    • 如果轻量级CAS失败,就表明其他线程竞争锁,并可能膨胀为重量级锁。
  • JVM提供了一些参数用于控制锁的行为,例如:
    • -XX:BiasedLockingStartupDelay:偏向锁启动延迟时间,可通过设置减少或延迟偏向锁的使用,从而可能影响锁升级。
    • -XX:-UseBiasedLocking:禁用偏向锁,如果禁用,程序在启动时锁会直接进入轻量级锁状态,可能更快膨胀为重量级锁。
    • -XX:PreBlockSpin:设置自旋次数,影响轻量级锁膨胀为重量级锁的策略。
  1. 重量级锁(膨胀锁)

    • 当锁争用激烈时(例如,自旋的次数超过设定阈值),轻量级锁会膨胀成重量级锁。
    • 重量级锁使用操作系统的互斥量(mutex)来实现线程挂起和唤醒,从而确保线程的互斥访问。
synchronized的底层原理

synchronized的实现依赖于对象头中的Mark Word。在32位JVM中,Mark Word通常占用32位,而在64位JVM中则占用64位。Mark Word用于存储锁标识和状态信息,如哈希码、GC分代年龄、锁状态等。

  • 加锁:当进入一个同步块或者同步方法时,线程会尝试使用CAS操作修改对象头中的Mark Word来获取锁。

  • 解锁:离开同步块或方法时,线程会通过CAS操作释放锁。如果锁已经膨胀为重量级锁,解锁则涉及操作系统层面的互斥量解锁操作。

相关文章:

  • 微服务》》Kubernetes (K8S)安装
  • go语言学习教程推荐,零基础到做项目
  • 【JavaScript】一、JS的引入与输入输出
  • 0基础 | 直流稳压电源专题3
  • 牛客竞赛记录——小紫的优势博弈(Python3题解)
  • CentOS 7 更换 YUM 源为国内
  • 高中信息技术学科核心素养评价体系的构建与实践研究
  • RESTful API 简介与使用
  • 数据结构——排序
  • 【探寻C++之旅】第九章:二叉搜索树
  • GetX 中GetView、GetXController 和 Bindings的联合使用
  • minikube部署Go应用
  • 蓝桥杯备考-----》差分数组+二分答案 借教室
  • deepseek连续对话与API调用机制
  • axios防止重复请求
  • DJ串烧集 2.4.5 | 海量大型DJ串烧歌曲,无广告,无需登录,高清在线播放
  • Apache Shiro 使用教程
  • Redis,从数据结构到集群的知识总结
  • OpenGL ES 入门指南:从基础到实战
  • 【JavaEE】Spring Boot 日志
  • 莫高义在第四届中国新闻发言人论坛开幕式上的致辞
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药
  • 广西:坚决拥护党中央对蓝天立进行审查调查的决定
  • 丰富“互换通”产品类型,促进中国金融市场高水平对外开放
  • 上海制造佳品汇大阪站即将启幕,泡泡玛特领潮出海
  • “养胃骗局”大公开,真正有用的方法究竟是?