偏向锁的获取和撤销详解
创作时间:
作者:
@小白创作中心
偏向锁的获取和撤销详解
引用
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个杏鲍菇食谱,低热量、零技巧!杏鲍菇这样做超有饱足感又好吃
干煸杏鲍菇的奇妙之旅:从厨房新手到美食大师,一锅香脆可口秘密
如何高效利用学术数据库资源
全球车企智能驾驶技术发展盘点
喝醪糟开车算不算酒驾?音量旋钮失灵怎么办?
脂漏性皮炎是什么?彻底了解成因症状及治疗新概念
煮养生茶用什么壶比较好?选对壶,茶更香!
网络诈骗的常用手法及防范策略
广电新卡办理后多久可携号转网?
青菜的营养价值及功效
自身免疫溶血性贫血是什么病引起的怎么治疗
溶血性贫血的治疗方法
四月限定!“2花3菜”正当季,错过再等一年
别再争辩咖啡致癌还是防癌了!来看看权威的世界卫生组织辟谣吧
“史铁生又火了”的启发,让每个孩子有热爱的“人生之书”
PHP获取用户客户端真实IP地址的多种方法详解
香港买的东西可以寄快递到国内吗?
新能源汽车工程专业求职者怎样写好项目经验
新能源汽车技术专业主要学什么?这些核心课程和就业方向你必须知道!
Excel图例没有文字怎么办?多种实用解决方案帮你轻松应对
成都限行一天算几次?成都限行处罚规定
杭州临牌限行的规定是怎样的?如何准确了解并遵守这些规定?
小布尔乔亚是褒义还是贬义(小布尔乔亚:褒贬不一的社会阶层解析)
OSS前端直传安全性保障指南
指针万用表内部结构图详解
视觉设计Logo:创意、技巧与趋势的深度剖析
如何选择一款合适的家庭影院功放?