偏向锁,轻量级锁,重量级锁对比

偏向锁
如果不存在线程竞争的锁获取到了锁,那么就进入了偏向锁的,此时的Mark Word的结构就转换为偏向锁结构,锁对象的所标志位被修改为01.以后线程进入同步块的时候,只需要判断一下线程ID和标志位即可,不需要进行CAS.

轻量级锁

轻量级锁主要有普通自旋锁,自适应自旋锁
普通自旋锁,就是线程在竞争的时候,会循环等待,直到锁被释放。
自适应的自旋锁,就是如果抢夺的线程获取过锁,那么自旋的时间就会相应的更长,相反,如果没有获取过,自旋的时间就会相对较少甚至没有。

重量级锁
所谓的重量级锁就是通过监视器的方式保障了任何时间只允许一个线程通过受监视器保护的临界区代码。
所谓的监视器就是个同步的工具,主要的特点就是
1、同步,监视器所保护的临界代码是互斥的执行,一个监视器是一个运行许可,任何线程进行临界代码区都需要获取写个许可,离开的时候归还许可。
2、协作,就是允许让有许可的线程进入等待阻塞状态,等待其他线程进行signal唤醒
监视器主要有三个比较重要的抢夺重量级锁的队列
1、Cxq:竞争队列,所有请求锁的线程首先被放在这个竞争队列中
2、EntryList:Cxq中那些有资格成为候选资源的线程被移动到EntryList中
3、WaitSet:某个线程在调用wait()方法后,就会被放到waitset中

大致的执行流程:
1、线程抢夺锁的时候,首先检测内置的Mark Word中的偏向锁标识是否是1,锁标志位是否是01,如果满足,确认内置锁对象为可偏向状态。
2、如果确认之后,JVM就会检查Mark Word中的线程ID是否是抢锁的线程ID,如果是的,就表示是偏向锁状态,就快速获取,直接进入临界执行,如果ID不是抢锁线程的ID,就是进行CAS操作,就说获取成功,说明此时还是偏向锁,否则,就说明发生了竞争,进而撤销偏向锁,进入轻量级锁
3、JVM适应CAS操作将锁对象的Mark Word替换为抢夺线程的锁记录指针,如果成功,抢夺线程获得锁,如果失败,说明其他线程获得锁,进行自旋操作,如果自旋成功,说明依然是轻量级操作,如果失败,膨胀为重量级锁。

对比

优点缺点场景
偏向锁加锁和解锁不需要额外的消耗如果存在竞争,就会产生锁撤销的消耗适应于一个线程的场景
轻量级锁竞争的线程不会阻塞抢不到就自旋等待,浪费cpu锁占用的时间低,吞吐量低
重量级锁线程竞争不自旋线程阻塞,相应慢锁占用时间长,吞吐量高
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阖家团圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值