synchronized底层的锁

本文深入探讨Java中的偏向锁机制,解释其如何优化锁的获取过程,同时介绍了大端小端存储模式。文章还详细阐述了无锁、轻量级锁和重量级锁的状态转换,并分析了在开启偏向锁时不同场景下的锁状态。通过对这些概念的理解,有助于提升对Java并发性能优化的认识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

偏向锁:

       部分情况下,锁不仅不存在竞争,而且总是由一个线程多次获得, 为了让获取锁的代价更低,就有了偏向锁。 当一个线程使用synchronized方式获取了一个锁对象时,会在该对象的对象头中存储当前线程的ID,后续这个线程再次去获取该锁对象时,直接进行线程ID的比较,成功就表示该锁是偏向当前线程的,不需要再次获取锁了。

大端小端存储:计算机存储一般是小端

大端:低地址存放高位字节,高地址存放低位字节

小端:低地址存放低位字节,高地址存放高位字节

例:0x12345678存放进下面地址:

                        小端                                  大端

4000                0x78                                 0x12

4001                0x56                                 0x34

4002                0x34                                 0x56

4003                0x12                                 0x78

无锁(无锁可偏向,无锁不可偏向)、轻量级锁、重量级锁

没有开启偏向锁的情况下:

       一个对象没有被作为锁对象,处于无锁状态

      一个对象被一个线程获取作为锁对象,处于轻量级锁状态

      一个线程已经持有了该锁对象,其他线程来争用,处于重量级锁状态。

开启偏向锁的情况下:

(修改偏向锁的延迟时间的参数:-XX:BiasedLockingStartupDelay=0)

      一个对象没有被作为锁对象,处于无锁可偏向状态。(对象头中没有记录线程ID)

      一个对象被一个线程作为锁对象,处于无锁可偏向锁状态。(对象头中记录了线程ID)

     一个对象被一个线程作为锁对象,释放锁对象后(但是该线程没有消亡时,如果消亡则是无锁可偏向状态),其他线程再获取该锁对象,则处于轻量级锁状态。

     一个对象被一个线程作为锁对象,没有释放锁,其他线程也要获取该锁对象,就处于重量级锁状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值