synchronized锁升级流程(轻量级锁,重量级锁,偏向锁,锁膨胀,自旋)

  1. 轻量级锁:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。

    1. 进行加锁操作时,会在当前线程的栈帧中划分一块空间存储锁记录,内部存储锁对象的Mark Word信息。

    2. 让锁记录中的Object reference指向锁对象,并尝试用CAS将锁对象的Mark Word替换锁记录的指针。

    3. 如果CAS成功,对象头中会存储锁记录地址与其状态标志00,表示此对象处于轻量级锁状态。

    4. 如果CAS失败,有两种情况:

      • 如果其他线程已经持有了该对象的轻量级锁,则表明有竞争,进入锁膨胀过程。

      • 如果发现是自己持有表明进行了锁重入,在锁记录中添加一条值为null的锁记录作为重入的计数。

        这个过程可以通过偏向锁优化:如果锁重入时发现是自己持有,则锁归该线程所有,后续不发生竞争的话就不用重新CAS。

  2. 重量级锁:轻量级锁经历锁膨胀变成重量级锁。

    1. 线程1进行加锁时发现锁对象已经被线程0占有,这时线程1加轻量级锁失败,进入锁膨胀过程。
    2. 然后为锁对象申请Monitor,并使锁对象指向它。
    3. 然后自己进入Monitor的EntryList队列等待。
    4. 这个过程可以通过自旋进行优化,当获取锁失败时会进行自旋重试,默认为10次,如果自旋成功就可以避免线程进入阻塞状态。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值