synchronized和Lock的区别与实现原理
作为Java程序员,面试时被问synchronized和lock的区别简直是高频考题。今天咱们就掰开揉碎讲讲这两个并发核心工具的实现原理和实际差异,帮你轻松应对面试!
一、基础用法对比
synchronized是Java原生的关键字,直接在方法或代码块上加锁:
// 对象锁
public synchronized void method() {
// 临界区
}
// 代码块锁
public void method() {
synchronized(this) {
// 临界区
}
}
而Lock是接口,需要显式创建对象:
Lock lock = new ReentrantLock();
public void method() {
lock.lock(); // 手动上锁
try {
// 临界区
} finally {
lock.unlock(); // 必须手动释放!
}
}
👉 最直观区别:synchronized自动释放锁,Lock必须手动解锁,忘记unlock()会导致死锁!

二、底层实现原理剖析
synchronized实现原理:
- 字节码层面通过
monitorenter和monitorexit指令实现 - 依赖JVM内置的对象监视器(Monitor)
- 锁状态存储在对象头Mark Word中(无锁/偏向锁/轻量锁/重量锁)
- 锁升级过程:偏向锁→轻量锁→重量锁(不可逆)
Lock实现原理(以ReentrantLock为例):
- 基于AQS(AbstractQueuedSynchronizer)队列
- 通过CAS+自旋实现线程竞争
- 维护双向同步队列管理阻塞线程
graph LR
A[线程A获取锁] --> B{AQS状态=0?}
B -->|是| C[CAS修改状态为1]
B -->|否| D[加入CLH队列阻塞]
三、核心功能差异
| 特性 | synchronized | Lock | |--------------------|--------------|--------------| | 超时获取 | ❌ | ✔️ (tryLock) | | 可中断等待 | ❌ | ✔️ | | 公平锁 | ❌ | ✔️ | | 多条件变量 | ❌ | ✔️ (Condition)| | 锁绑定多个条件 | ❌ | ✔️ |
👉 关键场景选择:
- 需要公平锁 → 选Lock
- 需定时获取锁 → 选Lock
- 简单同步场景 → 选synchronized
四、性能与死锁预防
synchronized在JDK6后做了大幅优化(锁消除/锁粗化/适应性自旋),与Lock性能差距已不明显。但遇到死锁时:
- synchronized:只能重启JVM
- Lock:可用
tryLock()检测死锁并回退
if (lock1.tryLock(1, TimeUnit.SECONDS)) {
try {
if (lock2.tryLock(1, TimeUnit.SECONDS)) {
// 业务逻辑
}
} finally {
lock2.unlock();
}
}
2025年Java面试宝典最新版已整理完毕,包含200+并发编程考点:
🔗 百度网盘链接
提取码: 9b3g
💡 面试小技巧:当面试官问“synchronized和lock的区别”时,按这个逻辑回答:
- 基本用法(自动vs手动)
- 底层实现(Monitor vs AQS)
- 功能扩展(公平锁/条件变量等)
- 适用场景举例
最后分享个福利:如果大家准备购买面试鸭会员,通过面试鸭返利网找我可返利25元,相当于75折优惠!会员题库包含synchronized和lock的15种实战场景题,并有详细原理图解:
任何并发问题欢迎来面试鸭返利网交流讨论,咱们下期讲AQS源码如何实现非阻塞同步!



