Java-- synchronized--原理总结--偏向锁和自旋优化

Java-- synchronized--原理总结--偏向锁和自旋优化

偏向锁

首先我们了解一下对象头MarkWord结构

在这里插入图片描述
一个正常对象的对象
后面的lock 分别对应着对象的不同状态, 注意:正常状态和偏向锁都是01结尾,但是偏向锁的倒数第三位是1,正常的是0,偏向锁前面存储的偏向线程id和时间戳

下面是对象MarkWord不通状态存储的不同信息
在这里插入图片描述
在我们使用synchronized包裹临界区代码块时访问MarkWord中偏向锁的标识是否设置成1,锁标志位是否为01,确认为可偏向状态。如果为可偏向状态,则测试线程ID是否指向当前线程,如果是就执行synchronized包裹的代码,对比轻量级锁,他减少了CAS操作锁记录替换锁对象的MarkWord的操作和储存一个指针指向锁对象的操作,减少了执行步骤提高了执行效率,但是一旦有其他线程来获取该锁对象,但是没有资源竞争的情况,锁就会自动升级为轻量级锁,如果随即发生了资源竞争的情况锁就会升级为重量级锁

自旋优化

重量级锁在相互竞争的时候,线程先会进入一个自旋,如果当前线程自旋期间成功的获得了锁,那么就避免了当前线程阻塞,避免了上下文切换,因为上下文切换是非常慢的,非常耗费性能
自旋成功的情况
在这里插入图片描述
失败情况
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值