java 偏向锁怎么升级为轻量级锁

因为偏向锁,锁住对象时,会写入对象头相应的标识,我们先把对象头(官方叫法为:Mark Word)的图示如下(借用了网友的图片):

      

 

 

    通过上面的图片,我们可以知道,对象处于偏向锁时,mark word中的偏向锁标记为1,锁标志位为01;下面是分析过jvm源码(biasedLocking.cpp)解析的偏向锁升级流程(忽略一些细节),示例中:线程1当前拥有偏向锁对象,线程2是需要竞争到偏向锁。

  1. 线程2来竞争锁对象;
  2. 判断当前对象头是否是偏向锁;
  3. 判断拥有偏向锁的线程1是否还存在;
  4. 线程1不存在,直接设置偏向锁标识为0(线程1执行完毕后,不会主动去释放偏向锁);
  5. 使用cas替换偏向锁线程ID为线程2,锁不升级,仍为偏向锁;
  6. 线程1仍然存在,暂停线程1;
  7. 设置锁标志位为00(变为轻量级锁),偏向锁为0;
  8. 从线程1的空闲monitor record中读取一条,放至线程1的当前monitor record中;
  9. 更新mark word,将mark word指向线程1中monitor record的指针;
  10. 继续执行线程1的代码;
  11. 锁升级为轻量级锁;   
  12. 线程2自旋来获取锁对象;

 

转载于:https://www.cnblogs.com/baxianhua/p/9391981.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
偏向锁Java中用于提高单线程执行性能的一种优化手段。它适用于多线程环境下只有一个线程访问同步块的情况。 偏向锁的设计思想是,当一个线程访问同步块时,首先会将对象头中的标记设置为偏向锁,并将当前线程ID记录在对象头中。之后,线程进入同步块时,不需要进行任何同步操作,直接执行同步块的代码。这样可以避免了多线程竞争带来的性能损失。 但是,当有多个线程竞争同一个时,偏向锁就不再适用了。这时候就需要升级轻量级轻量级是为了解决多线程竞争同一个而引入的一种优化机制。 轻量级的设计思想是,在多个线程竞争同一个时,首先会尝试使用CAS操作来获取,如果成功则可以继续执行同步块的代码,否则会升级为重量级(使用互斥量)。 升级轻量级的原因是,虽然偏向锁在单线程环境下性能很好,但是在多线程环境下会带来额外的开销。因为每次线程访问同步块时都需要检查对象头的偏向锁标记,并且可能会涉及到偏向锁的撤销操作。而轻量级通过CAS操作来尝试获取,避免了偏向锁的额外开销,提高了多线程环境下的性能。 相关问题: 1. 什么是偏向锁?它的原理是什么? 2. 偏向锁在什么情况下会失效? 3. 轻量级是如何实现的?它与重量级有什么区别?

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值