一文搞懂偏向锁状态、轻量级锁状态、重量级锁状态

首先需要一些前置知识。我们知道对象是存在堆中的,实际上在为这个对象分配的内存中还存在着对象头,对象头中有很多信息,其中包括这个对象的状态。

偏向锁状态当一个锁被一个线程占有的时候,这个锁的状态就变成了偏向锁,线程ID就是持有这个锁的线程。

下次又有线程来访问的话,如果发现访问的线程和偏向锁中的线程一样,就直接进入到同步块了。

通俗来讲就是:假设A线程要使用m对象这个锁,那么B对象的对象头就会记录下来现在是A在使用,下次A再来,直接进入了,不用再获取锁了。这样做的好处是,如果一直是线程A来访问的话,就不用消耗加锁、去锁的时间了

轻量级锁状态:我们考虑,这个m对象肯定不是永远A线程在用吧?当B线程来抢这把锁的时候(也就是下次访问的线程不是A),当后续发生竞争这个锁的时候,就升级膨胀为轻量级锁。

假设B想去竞争m对象,发现A还没释放锁,咋办,阻塞? 漏,大漏特漏。当线程比较少的时候,B会一直去要这个锁(自旋),B一直喊着我要,我要,我要,终于A完事了,轮到B了。利用了CAS

自旋锁好到哪里?(大家可以搜索以下用户态向内核态转换为什么耗时,因为重量级锁会让该线程挂起,挂起操作需要内核态来完成。)

重量级锁状态:那B线程拿不到锁,一直在那自旋靠谱么,显然不靠谱,自旋十次还没拿到锁,就升级为重量级锁。因为自旋也是需要浪费资源的,线程说:你让我一直在这自旋,还不如让我挂起一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值