JAVA中synchronized锁升级及4种状态

锁可以升级,但不能降级。即:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁是单向的

32位的jvm里面对象头示例

无锁 :biased_lock(0),01。这个时候的biased_lock 是0的时候就表示了现在无偏向

偏向锁:biased_lock设成1代表该对象锁成为了偏向锁,并且在原来存hashcode的地方将偏向的线程记录了,这个时候调用对象的hashcode()方法会使偏向锁生效

轻量级锁 :当一个线程尝试获取一个对象的锁时,如果发现该对象处于偏向锁状态,但是不是自己持有偏向锁,那么就需要升级为轻量级锁。轻量级锁的实现通常也会使用CAS操作来尝试获取锁,这个时候会通过替换锁对象头的引用来确定,如果当前锁对象头不是锁对象本身的地址那么就证明在同一时间发生了竞争,竞争情况下可能膨胀为重量级锁。00(指轻量级锁状态)

重量级锁:升级后前面持有锁的线程在还回去的时候发现了还不回去锁对象已经创建了Monitor,这个时候线程就需要将owner置为null,然后唤醒阻塞中的线程。10(指重量级锁状态)

重量级锁也有优化,在重量级锁的情况下线程在没有获取到锁的情况下不会立即阻塞,阻塞是需要切换上下文的是需要耗费资源的,线程会进行一个自旋操作继续获取锁万一锁释放了呢(自旋耗费CPU性能,单核CPU自旋就是浪费),jvm会根据前面自旋成功的情况给我们智能的调节自旋的次数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值