为什么说synchronized是重量级锁


首先需要理解的是,当锁被占用的时候,Synchronized和ReentrantLock的区别是不大的。原因如下:
Synchronized可以通过关联的Moniter对象中的Owner发现锁已经被占用,然后直接阻塞当前线程
ReentrantLock通过锁状态state可以发现锁被占用,然后直接调用Unsafe.park()阻塞线程

当锁没有被占用,也就是说Moniter对象中的Owner == null 时,并且ReentrantLock中的state为0时,就会体现出的差别

Synchronized 底层是依赖于操作系统指令实现( mutex lock )的,锁的状态是由内核来维护的,也就是说每次尝试获取锁的时候都需要先挂起线程切换到内核态,然后由内核去做协调,然后去阻塞or唤醒线程
ReentrantLock 锁状态的维护是基于一个字段 state 的(ReentrantLock在Java层面维护锁的状态),因此不需要每次都切换到内核态进行判断,如果获取成功的话可以省去一次用户态/内核态的切换

值得注意的是:尽管 ReentrantLock 不需要切换到内核去维护锁状态,但是在线程需要阻塞的情况下,内核态/用户态的切换还是无法避免的(线程的唤醒和挂起依旧是需要由内核进行的)

来源:https://www.ngui.cc/article/show-375854.html?action=onClick
https://blog.csdn.net/m0_56085369/article/details/124181191

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值