← 返回并发与锁
🔐 锁对比
synchronized vs ReentrantLock + 锁升级原理
| 维度 | synchronized | ReentrantLock |
| 层级 | JVM 关键字 | API 层(AQS) |
| 释放 | 自动(出代码块) | 手动 unlock(finally!) |
| 可中断 | ❌ | ✅ lockInterruptibly |
| 超时 | ❌ | ✅ tryLock(timeout) |
| 公平 | 非公平 | 可选公平/非公平 |
| 多Condition | ❌ | ✅ 精准唤醒 |
| 选型 | 简单同步用这个 | 需要高级特性用这个 |
// synchronized:简单
synchronized (lock) { // 临界区 }
// ReentrantLock:灵活
lock.lock();
try { // 临界区 }
finally { lock.unlock(); // 必须 finally! }
// tryLock 超时(防死锁)
if (lock.tryLock(3, TimeUnit.SECONDS)) {
try { /* 临界区 */ }
finally { lock.unlock(); }
}
synchronized 锁升级(JVM 自动优化):
① 无锁 → ② 偏向锁(只有一个线程用,记线程id) → ③ 轻量锁(多线程但无竞争,自旋CAS) → ④ 重量锁(激烈竞争,OS互斥量)
JVM 自动升级,不需要手动干预。大部分场景 synchronized 性能已经够好。
并发与锁 · 锁对比 · 全栈资料库