synchronized 和 ReentrantLock 的区别?
发布于
一、底层实现
- synchronized:JVM 级,字节码指令 monitorenter/monitorexit,依赖对象头的 Mark Word。
- ReentrantLock:JDK 级,基于 AQS(AbstractQueuedSynchronizer)实现。
二、对比
| 维度 | synchronized | ReentrantLock |
|---|---|---|
| 实现 | JVM | JDK |
| 释放 | 自动 | 需手动 unlock(finally) |
| 公平锁 | 非公平 | 可配置公平/非公平 |
| 可中断 | 不可 | lockInterruptibly |
| 超时 | 不支持 | tryLock(timeout) |
| 条件变量 | 一个 | 多个 Condition |
三、锁升级(synchronized)
无锁 → 偏向锁 → 轻量级锁 → 重量级锁,只能升级不能降级。
四、使用建议
简单同步用 synchronized(不易忘记解锁);需要公平、可中断、超时、多条件时用 ReentrantLock。