基本特性对比
| 特性 | synchronized | ReentrantLock |
|---|---|---|
| 实现机制 | JVM 内置关键字,监视器实现 | JDK API 类(java.util.concurrent.locks) |
| 获取方式 | 隐式(进入/退出同步块自动处理) | 显式调用 lock()/unlock() 方法 |
| 可重入性 | 支持 | 支持 |
| 锁类型 | 非公平锁(默认) | 可选公平或非公平(构造函数指定) |
| 条件变量 | wait()/notify()/notifyAll() | Condition 对象支持多个条件队列 |
| 中断响应 | 不支持 | 支持 lockInterruptibly() |
| 超时机制 | 不支持 | 支持 tryLock(timeout, unit) |
| 锁绑定 | 与代码块或方法绑定 | 可跨方法绑定,更灵活 |
| 性能 | JDK 1.6 后优化,接近 | 高并发竞争下表现更稳定 |
深入分析
底层实现
synchronized 是 Java 关键字,依赖 JVM 底层(monitorenter/monitorexit 指令),锁信息存在对象头 Mark Word 中。ReentrantLock 基于 AbstractQueuedSynchronizer(AQS),利用 CAS 和队列管理线程竞争。
使用习惯
synchronized 不需要手动释放,编译器会自动处理,降低了死锁风险。ReentrantLock 必须显式调用 unlock(),通常放在 finally 块中确保释放。
// synchronized 示例
public synchronized void method() {
// 同步代码
}
// ReentrantLock 示例
private final ReentrantLock lock = new ();
{
lock.lock();
{
} {
lock.unlock();
}
}


