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

synchronized底层原理+锁升级

一、底层原理
  1. 同步代码块:通过 monitorenter 和 monitorexit 两条字节码指令来实现,本质是获取对象的 Monitor(监视器锁)
  2. 同步方法:通过方法上的 ACC_SYNCHRONIZED 访问标志来标识,当方法被调用时,调用指令会检查该标志,然后自动执行加锁和解锁的过程
二、Monitor

Monitor 是线程私有的数据结构,每一个java对象潜在的与一个Monitor相关联,在java对象头中存在一个指向Monitor的指针。

Monitor 主要包含的组件:

  1. owner:指向持有该monitor的线程,初始时为null
  2. entryList:处理 BLOCKED 阻塞状态的线程,正在等待锁释放,以竞争所有权
  3. waitSet:处于 Waiting 状态的线程,这些线程执行了 object.wait() 方法,等待被 notify() / notifyAll() 唤醒

工作流程:

  1. 线程执行到 monitorenter 指令时,会尝试占用该对象的 Monitor
  2. 如果 owner 为null,当前线程成为 owner,并将计数器置为1
  3. 如果当前线程已经是 owner,且是可重入锁,则重入此锁,计数器加1
  4. 如果 owner 是其它的线程,当前线程进入到 entryList 中,变成 BLOCKED 状态
  5. 持有 Monitor 的线程执行完同步代码块后,会执行 monitorexit 指令,将计数器减1。当计数器减为0时,线程释放 Monitor,并唤醒 entryList 中等待的线程来重新竞争锁

Monitor机制是依赖于操作系统的 Mutex Lock 互斥锁来实现的,涉及到用户态到内核态的切换,进程需要切换上下文,成本非常高,所以 synchronized 是一个重量级锁。

三、锁升级

为减少获取锁和释放锁带来的性能消耗,synchronized 的锁是不断升级的,而不是一开始就是重量级锁,锁只能升级不能降级。锁的级别从低到高为:
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁

升级过程:
无竞争时,使用偏向锁,该线程后续进入和退出同步块时,发现记录的偏向的线程id是自身,则直接进入。当发现有其它线程来竞争锁时,偏向锁撤销,升级为轻量级锁;
轻量级锁时,通过CAS自旋来加锁和解锁,避免线程阻塞。CAS操作失败且之前加锁的不是自身,说明有多个线程在竞争,这时候会升级为重量级锁,也就是Monitor机制

http://www.dtcms.com/a/426793.html

相关文章:

  • VGG改进(12):PositionAttentionModule 源码解析与设计思想
  • OpenCV项目实战——数字识别代码及食用指南
  • Promise详细解析
  • 【从Vue3到React】Day 1: React基础概念
  • Hotfixes数据库工作原理、机制和应用流程
  • 网站建设面试表wordpress建m域名网站
  • Node.js面试题及详细答案120题(93-100) -- 错误处理与调试篇
  • pc端js动态调用提示音音频报错的问题解决
  • 网站的建设特色网站开发培训哪家好
  • C# 中的 简单工厂模式 (Simple Factory)
  • Docker linux 离线部署springcloud
  • 第 2 天:搭建 C 语言开发环境 ——VS Code/Dev-C++/Code::Blocks 安装与配置全指南
  • 基于 Celery 的分布式文件监控系统
  • CATIA二次开发(2)C#启用AOT
  • Linux 驱动开发与内核通信机制——超详细教程
  • 【langgraph】本地部署方法及实例分析
  • Linux入门指南:从零掌握基础指令
  • 做笔记的网站源码江永网站建设
  • 是时候重启了:AIGC将如何重构UI设计师的学习路径与知识体系?
  • uniapp 请求接口封装和使用
  • AIGC重构数据可视化:你是进化中的“驯兽师”还是被替代的“画图工”?
  • Apache Doris 内部数据裁剪与过滤机制的实现原理
  • 专业做网站流程小程序开发步骤大全
  • C语言基础之指针2
  • 淘客网站怎么做 知乎wordpress淘宝联盟插件
  • flink工作流程
  • openHarmony之storage_daemon:分区挂载与设备节点管理机制讲解
  • 建站怎么赚钱个人官方网站怎么建设
  • 学习笔记093——Windows系统如何定时备份远程服务器的mysql文件到本地?
  • 操作系统内核架构深度解析:从单内核、微内核到鸿蒙分布式设计