偏向锁的获取和撤销详解
创作时间:
作者:
@小白创作中心
偏向锁的获取和撤销详解
引用
CSDN
1.
https://blog.csdn.net/weixin_43882265/article/details/121318419
Java SE 1.6 为了减少获得锁和释放锁带来的性能消耗,引入了偏向锁和轻量级锁。在Java SE 1.6 中,锁共有4种状态,级别从底到高依次是:无锁状态、偏向锁状态、轻量级锁和重量级锁状态,这几种状态会随着竞争情况加剧逐渐升级。锁可以升级但不能降级。
1.偏向锁
HotSpot的作者经过研究发现,大多数情况下,锁不仅存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。
(1)偏向锁的获取
注意:当JVM启动了偏向锁模式(Java 6和Java 7里是默认启动的),新创建对象的Mark Word中的ThreadID为0,说明此对象处于偏向锁状态(但未偏向任何线程),也叫作匿名偏向锁状态。
- 线程A第一次访问同步代码块时,先检查对象头Mark Word中锁标志位是否为01,依此判断此时对象是否处于无锁状态或者偏向锁状态;
- 若锁标志位是为01,然后判断偏向锁的标识是否为1:
2.1 如果不是,则进入轻量级锁逻辑(使用CAS竞争锁)(注意:此时不是使用CAS尝试获取偏向锁,而是直接升级为轻量级锁;原因是:当偏向锁的标识为0时,表明偏向锁在此对象上被禁用,禁用原因可能是JVM关闭了偏向锁模式,或该类刚经历过bulk revocation,等等。所以应该入轻量级锁逻辑);
2.2 如果是1,表明此对象是偏向锁状态,则进行下一步流程。 - 判断是偏向锁时,检查对象头Mark Word中记录的ThreadID是否是当前线程A的ID:
3.1 如果是,则表明当前线程A已经获得过该对象锁,以后线程A进入同步代码块时,不需要CAS进行加锁,只会往当前线程A的栈中添加一条Displaced Mark Word为空的Lock Record,用来统计重入的次数。如下图。
3.2 如果不是,则进行CAS操作,尝试将当前线程A的ID替换进Mark Word;
3.2.1 .如果当前对象锁的ThreadID为0(匿名偏向锁状态),则会替换成功(将Mark Word中的Thread id由匿名0改成当前线程A的ID,在当前线程A栈中找到内存地址最高的可用Lock Record,将线程A的ID存入),获得到锁,执行同步代码块。
3.2.2 .如果当前对象锁的ThreadID不为0,即该对象锁已经被其他线程B占用了,则会替换失败,开始进行偏向锁撤销。这也是偏向锁的特点,一旦出现线程竞争,就会撤销偏向锁。
(2)偏向锁的撤销
- 偏向锁的撤销需要等待全局安全点(safe point,代表了一个状态,在该状态下所有线程都是暂停的,stop-the-world),到达全局安全点后,持有偏向锁的线程B也被暂停了。
- 检查持有偏向锁的线程B的状态(会遍历当前JVM的所有线程,如果能找到线程B,则说明偏向的线程B还存活着):
5.1 如果线程还存活,则检查线程是否还在执行同步代码块中的代码:
5.1.1 如果是,则把该偏向锁升级为轻量级锁,且原持有偏向锁的线程B继续获得该轻量级锁。
5.2 如果线程未存活,或线程未在执行同步代码块中的代码,则进行校验是否允许重偏向:
5.2.1 如果不允许重偏向,则将Mark Word设置为无锁状态(未锁定不可偏向状态),然后升级为轻量级锁,进行CAS竞争锁。
5.2.2 如果允许重偏向,设置为匿名偏向锁状态(即线程B释放偏向锁)。当唤醒线程后,进行CAS将偏向锁重新指向线程A(在对象头和线程栈帧的锁记录中存储当前线程ID)。 - 唤醒暂停的线程,从安全点继续执行代码。
补充:每次进入同步块(即执行monitorenter)的时候都会以从高往低的顺序在栈中找到第一个可用的Lock Record,并设置偏向线程ID;每次解锁(即执行monitorexit)的时候都会从最低的一个Lock Record移除。所以如果能找到对应的Lock Record说明偏向的线程还在执行同步代码块中的代码。
下图为当对象所处于偏向锁时,当前线程重入3次,线程栈帧中Lock Record记录:
热门推荐
方舟终极移动版:低温仓获取与使用全攻略
跟着旅发大会玩转赣南!
马云的新零售梦,醒了!
安远三百山:赣南必打卡的自然氧吧
敏捷晨会让团队协作更高效
《哪吒之魔童闹海》敖闰高清壁纸下载指南
晨会新花样:提升职场幸福感
晨会激励新玩法:提升团队效率
豫北战役:河南抗战的转折点
重温河南抗战史:太行与水东的烽火岁月
广东必尝:沙湾姜撞奶、云吞面和布拉肠
打卡广州塔和陈家祠:广东历史文化探秘之旅
广东冬游打卡:广州塔、大梅沙、珠海长隆必去!
结婚后分户政策全攻略:条件、流程与注意事项
南昌到九江:赣江沿线自驾游完全攻略
赣州到南昌自驾游:5个必打卡景点,让你的冬日之旅精彩纷呈
“美丽经济”与“美丽乡村”双向奔赴 让农村“财貌双全”
追风药酒的功效与使用禁忌
甜叶菊:糖尿病和高血压患者的天然良方
甜叶菊:养生界的网红甜品
如何选择可靠的私营加油站?到底有没有不为车主知道的秘密?
年后晨会:如何打造高效的企业文化?
年后晨会效率提升:PingCode与Worktile的应用实践
春晚国风舞蹈《咏春》:影视作品的新宠儿
《蛇来运转》:春晚舞台上最引人争议的舞蹈
2025春晚《栋梁》:国风舞韵展现传统文化魅力
华山四季游:最佳旅行时间指南,每个季节都有不同的故事
陶渊明:隐逸诗人之宗
如何预防运动损伤
西晋十大名将:从灭吴到抵御外敌的英雄传奇