Java并发 | 18.[锁机制] 轻量级锁(CAS+自旋锁)

1. 轻量级锁分析

回顾重量级锁

在上文 Java并发 | 17.[锁机制] 重量级锁(Monitor+自旋锁)中对重量级锁进行过解析,需要实现重量级锁,就要向操作系统申请一个 Monitor 对象。

轻量级锁的优势

轻量级锁使用CAS和自旋锁来获取锁,避免了向操作系统申请 Monitor 对象,从而减少性能消耗。

2. CAS(Compare And Swap)

顾名思义,在进行比较后如果满足条件,就会交换内容。

在轻量级锁机制中,则是判断 obj 中 Mark Word 是否为 "指向LockRecord"的指针,若不是,则将当前线程中 “LockRecord 里指向自己的指针” 与 MarkWord 交换。

CAS概述

3. 轻量级锁(CAS+自旋锁)

3.1. 整体流程图

轻量级锁流程图

3.2. 加锁、锁重入、锁释放(CAS)

  • [加锁] 线程t1发现 obj 的 MarkWord 不是「指向LockRecord的指针」,于是 将指向LockRecord的指针与MarkWord 进行交换(CAS);
  • [锁重入] 当一段 synchronized( obj1 ) 代码块中递归地执行了 synchronized( obj1 ) 代码块,就会出现「锁重入」,此时虽然CAS失败,但线程t1发现指针指向的 LockRecord 是属于自己的,于是创建一个新的 LockRecord 用于计数;
  • [锁释放]synchronized( obj ) 代码块执行完毕,则 将MarkWord与指向LockRecord的指针 换回原来的位置(再次CAS)。

轻量级锁

3.3. 锁膨胀(CAS+自旋)

若发生了锁竞争(线程t2尝试CAS失败,并发现对象头中指针指向的LockRecord并不属于自己),那线程t2就会循环 争抢锁直到超出次数上限(默认10次,JVM底层会自适应调整),就会将锁升级为「重量级锁」。

  • [申请Monitor] 向操作系统申请一个 Monitor 对象;
  • [重置指针、进入EntryList] obj 中的指针被替换成「指向Monitor的指针」,Monitor 中的 Owner 指向 t1,t2 进入 EntryList 并进入 BLOCKED 状态;
  • [唤醒t2] t1 执行完毕后,尝试 CAS 失败,说明锁已进行过升级,于是根据JVM底层算法,唤醒 EntryList 中的某个线程,并使之成为「重量级锁」的新 Owner。

锁膨胀

参考资料

[视频] 04.030-synchronized优化原理-轻量级锁

[文章] 从偏向锁是如何升级到重量级锁的-轻量级锁

  • 0
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

xyx-Eshang

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值