java并发机制底层实现原理--偏向锁

为什么需要偏向锁

在大多数的情况下,锁不仅不存在多线程的竞争,往往是某个线程多次获得锁。为了降低线程获得锁和释放锁带来的性能消耗,因此引入了偏向锁和轻量级锁。偏向锁主要是降低单线程访问时频繁加锁,释放锁的消耗,当前线程一旦获得锁,再无竞争的情况下,那么下次访问代码块相当于几乎零成本的获得锁,不需要维护轻量级锁。

偏向锁的加锁过程

一个线程获得代码块的偏向锁,java对象头的MarkWord和栈帧的锁记录会存储偏向线程的ID。每次该线程出入代码块时,不需要进行CAS加锁和解锁,只要确认MarkWord中是否有指向该线程的偏向锁。如果确认有,那么说明该线程已经获得了锁。如果没有,检查是否偏向锁的标志位为1。如果为1,那么说明是偏向锁,那么CAS会尝试去将偏向锁指向当前线程,成功的话,就获得了偏向锁。如果偏向锁标志位为0,就说明不是偏向锁,那么使用CAS锁。

偏向锁的释放过程

只有产生锁竞争时,才会释放偏向锁。假设当前线程1获得偏向锁,线程2访问加锁的代码块。撤销偏向锁,在全局安全点暂停拥有偏向锁的线程,查看线程1是否存活。如果线程已经死亡,对象头设置为无锁状态(无锁状态,就可以执行线程2的加锁过程,CAS将偏向锁指向线程2)。如果线程1依然存活,那么产生锁竞争,释放阻塞的线程2进入轻量级锁执行路径,恢复撤销偏向锁后的线程1。

偏向锁的缺点

偏向锁适用单线程访问的情况,会在产生锁竞争时自动膨胀为轻量级的锁。那么在锁竞争激烈业务中下,显然偏向锁是不适合的,这种状况下,应该关闭偏向锁,-XX:UseBiasedLocking = false,此时程序默认进入轻量级锁状态。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值