偏向锁、轻量级、重量级锁

一、Object结构

在这里插入图片描述

1. 32位虚拟机

  • Mark Word:32bits
  • Klass Word:32bits
  • 数组长度(可选):32bits
  • thread:线程ID
  • ptr_to_lock_record:指向锁记录的指针
  • ptr_to_heavyweight_monitor:指向对象监视器(monitor)的指针

在这里插入图片描述

2. 64位虚拟机

  • Mark Word:64bits
  • Klass Word:64bits
  • 数组长度(可选):64bits
  • thread:线程ID
  • ptr_to_lock_record:指向锁记录的指针
  • ptr_to_heavyweight_monitor:指向对象监视器(monitor)的指针

在这里插入图片描述

二、偏向锁

在这里插入图片描述
在这里插入图片描述

三、轻量级锁

轻量级锁的应用场景:当有多个线程要对对象加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化,轻量级锁对使用者是透明的,即语法仍然是 synchronized
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、锁膨胀

在这里插入图片描述
在这里插入图片描述

五、重量级锁

在这里插入图片描述

六、总结

偏向锁:偏向锁的目的是在某个线程获得锁之后,消除这个线程锁重入(CAS)的开销,看起来让这个线程得到了偏护。引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令。偏向锁适用于无竞争的场景在只有一个线程执行同步块时可以进一步提高性能 ,轻量级锁是为了在线程交替执行同步块时提高性能。如果要执行同步代码,就尝试使用CAS修改ThreadID,修改成功执行同步代码,不成功就将偏向锁升级成轻量锁

轻量级锁:获取轻量锁的过程与偏向锁不同,竞争锁的线程首先需要拷贝对象头中的Mark Word到帧栈的锁记录中。拷贝成功后使用CAS操作尝试将对象的Mark Word更新为指向当前线程的指针。如果这个更新动作成功了,那么这个线程就拥有了锁。如果更新失败,那么意味着有多个线程在竞争,轻量级锁就会膨胀为重量级锁。轻量级锁所适应的场景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀为重量级锁

重量级锁:当多线程竞争重量级锁竞争失败后线程会被阻塞直至锁被释放后唤醒阻塞的线程继续竞争。重量级锁适用于同步块执行时间长、锁竞争激烈的情况

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Malax

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

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

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

打赏作者

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

抵扣说明:

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

余额充值