Synchronized 和 ReentrantLock的区别

本文详细比较了Synchronized和ReentrantLock两种锁机制的特点和区别,包括其实现方式、锁的释放、中断能力及公平性等方面,并深入探讨了Synchronized锁升级机制及其底层monitor的实现原理。

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

Synchronized 和 ReentrantLock的区别
1. 实现方法
  Synchronized作为Jvm层面的锁,是java关键字,通过monitor完成,在指令运行时通过monitorenter和monitorexit来上锁,禁止指令重排。
  ReentrantLock作为jdk所提供的API,由CAS保证数据的原子性和volatile保证数据可见性以实现锁。

2.
  Synchrobnized不需要手动释放锁。
  ReentrantLock需要手动上锁和解锁,如果没有解锁会造成死锁。

3.
  Synchronized为 不可中断锁非公平锁
  ReentrantLock为可中断锁公平锁,ReentrantLock在抢不到锁而等待的时候可以中断操作,去做其它的事情。

4.
ReentrantLock可以结合Condition,实现复杂的多线程操作。
  ReentrantLock通过绑定Condition结合await()/singal()方法实现线程的精确唤醒,
而synchronized不行。

Synchronized
本身会行成偏向锁/轻量级锁/重量级锁
偏向锁
记录第一个访问的线程,如果线程再访问,直接获得锁
轻量级锁
获取锁时另一个线程已经获取,通过自旋获取锁
重量级锁
锁竞争时间长时膨胀为重量级锁,其它竞争锁的线程直接Block阻塞。

Synchronized 的底层monitor的实现
Monitor 由C/C++编写,java调用。

Monitor中的主要属性为

Owner 记录锁的持有者
WaitSet 存放 wait 的线程
EntryList 存放锁 block状态的线程
Recursions 锁的重入次数
Count 线程获得锁的次数。

多个线程访问一段同步代码时,除获得锁的线程,其它线程进入等待队列,等owner变为null,阻塞队列的线程唤醒,去获得monitor。

参考&搬运 https://zhuanlan.zhihu.com/p/126085068

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值