Synchronized锁

news/2024/10/17 22:15:16/

概览

锁的实现基于对象头重的MarkWord,分为 无锁 -> 偏向锁 -> 轻量锁 -> 重量锁 四个状态
image.png

状态转换

在这里插入图片描述

锁的获取与释放

模型:

  • Markword:指向Monitor的指针
  • Monitor:_cxq,_EntryList,_WaitSet,owner,_recursions[重入数量],_Succ

重量级锁

  • 场景:多线程竞争
  • 获取:
    • 线程T1尝试获取锁,if 当前_owner == NULL,则直接获取,_owner = Self,_recursions = 1; elif owner == Self,则_recursions++;
    • 线程T1发现锁被占用,T1被封装成ObjectWaiter插入到cxq,
      • 若T1是第一个等待线程,则会间歇性尝试获取锁park(interval):8秒
      • 否则无限期挂起park()
  • 释放:
    • _recursions > 0,则_recursions–(减少一次重入)
    • T1释放锁,根据不同的Knob_Qmode选择一个线程唤醒
      • Qmode == 1,则从EntryList取一个线程,若EntryList为空,则将cxq倒置插入到EntryList,再取
      • Qmode == 2,则从cxq重选择一个线程
    • 被选择唤醒的线程,将尝试获取锁

轻量级锁

  • 场景:线程间交替访问临界区(无竞争)
  • 获取:
    • 若无锁
      • T1将对象Lockee的Markword存储到Lock Record的displaced header重
      • 通过CAS尝试将LR的地址存储到Lockee的Markword,成功则表示T1获取了锁,否则进入锁膨胀逻辑
    • 若是轻量级锁,判断是否为T1
      • 是,表示重入,LR的displaced header设置为NULL,表示一次重复
      • 否,进入锁膨胀逻辑
  • 释放:
    • LR的displaced header设置为NULL
    • 若对象的Markword只想LR,从LR的displaced header重将原Markword’恢复,释放锁
    • 否则,进入锁膨胀逻辑
      在这里插入图片描述

偏向锁

  • 场景:仅一个线程访问过临界区
  • 获取与撤销:
    • T1检查锁对象,发现处于无锁,使用CAS将当前线程ID写入锁对象Markword,执行同步块内容
    • T1重入,锁处于偏向状态且threadid就是T1,无需重复获取(无需CAS)
    • T2访问临界区,锁对象处于偏向状态且非偏向自己,则在线程栈重新建一个Lock Record,用于存储对象的Markword,通过CAS尝试将 锁对象更新为LR地址
      • 成功:拥有该锁,锁标志改为00(轻量锁)
      • 失败:膨胀为重量锁

http://www.ppmy.cn/news/581975.html

相关文章

低代码平台究竟是什么

近几年,企业面临数字化转型带来的压力,为了快速适应行业变化和赶超竞争对手,在高级技术人才缺乏的情况下,低代码开发获得了企业的青睐。尤其对于企业数字化转型,在短时间内能完成信息化系统,低代码平台的快…

实践指南 | 风控引擎快速接入不同数据源的操作说明

随着互联网垂直电商、消费金融等领域的快速崛起,用户及互联网、金融平台受到欺诈的风险也急剧增加。网络黑灰产已形成完整的、成熟的产业链,每年千亿级别的投入规模,超过1000万的“从业者”,其专业度也高于大多数技术人员&#xf…

2023 年你还用 QQ 吗?

苏生不惑第411 篇原创文章,将本公众号设为星标,第一时间看最新文章。 前段时间qq 24周年有个活动可以查询自己qq号的全球排名https://m.weibo.cn/detail/4867534120028605 。我登陆下很久不用的qq,没想到账号密码没错居然还登陆不了&#xf…

Android 获取手机中微信聊天记录并后台发送到邮箱

实验软件 :Android Studio 实验设备:Root过的真机一部或者夜神模拟器 测试效果 废话不多说 直接上代码 获取手机微信数据库目录并发送邮件 class CoreService : IntentService("CoreService") {private val WX_ROOT_PATH "/data/dat…

QQ群导出某人消息记录至文本【python版】

快考试了,但是有的课没有教材也没有讲义,只有老师在群里的消息记录。 QQ群里导出消息记录,发现不能导出单独的联系人。 通常解决方法 方案一:手机端查找消息记录->联系人->长截图 方案二:电脑端设置->消息管…

WordCloud以词云记录聊天日常

做一个简单的中文字词云记录一下聊天日常,我用的文本是从QQ导出的聊天记录, 真的很有意思,有兴趣的也可以导出来试试看 注: 1.字体文件路径:C:\Windows\Fonts\字体文件名(中文字体在最下面)2.由…

IRC扫盲——你可以不会玩QQ,但不能不会IRC!

IRC扫盲——你可以不会玩QQ,但不能不会IRC! 详见: http://www.linuxsir.org/bbs/showthread.php?t29323 引用 IRC黑客世界最流行的交流工具,其强大而复杂的功能让许多人又爱又怕,花些精力和时间去学习和掌握它是绝…

QQ聊天记录器演示程序(DEPHI)

注:本篇没有高手需要的内容(因为此文中的技术实在无新意可言,只是些简单的实现),各位高手可以就此打住,若浪费宝贵时间,吾将深感不安. 作者网站: http://asp.itdrp.com/hottey ----------------hottey 嘘!好不容易有了一点轻松点的时候.现在才有时间把前几天做的QQ聊天记录器发…