偏向锁的获取和撤销详解
创作时间:
作者:
@小白创作中心
偏向锁的获取和撤销详解
引用
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记录:
热门推荐
如果人类都起源于非洲,那不同肤色是怎么出现的?
如何从网页源码查看答案
瞬态抑制器件:原理、类型及应用
外星人并不一定是“人”,他们的生命形态或超乎想象!
消防工程师考试资料选择哪个出版社 2025教材推荐
【时令节气】且看人间“三月三”
主动安全装置——ABS防抱死制动系统解析和正确使用
北京心血管专家范宗静医生:测血压前,为什么必须安静坐一会儿
亲戚之间:结怨之后,可以这样处理关系
Win11和Win7的对比:性能、界面、兼容性大PK
给神分类:自然神、神话神、民俗神和神化的历史人物
小儿腹泻的预防与治疗
健康饮用奶茶的"321"法则:既解馋又不伤身
景天科的主要特征
柔性防水套管与管道的连接方法 柔性防水套管漏水怎么处理
两个数差%如何计算?差异率计算方法详解
如何写好工作总结报告
戒烟后为何容易发胖?科学解析及应对方案
科普:鞋材都包括什么?都有什么优缺点
形意拳母拳:五行拳介绍
入籍澳洲的7大好处你知道吗?内附申请条件和流程
如何解决混合精度训练大模型的局限性问题
土豆病虫害防治培训课件
如何当好法官的左膀右臂:法官助理的角色与职责
《GTA 5》增强版已上线Steam,光追、高帧率等全新特性来袭!
专升本考前各科目复习方法分享!
如何诊断ABS系统的故障
甲状腺结节:颈间的小秘密,你了解多少?
五苓散的副作用和禁忌是什么
扁汉韵·史一鸣:一把降坡泥紫砂壶的匠心与茶道美学