直接回答:两者都是 Java 的可重入互斥锁。synchronized 是 JVM 层面的关键字,锁的获取与释放由编译器和虚拟机自动完成;ReentrantLock 是 JDK 提供的 API(java.util.concurrent.locks),需要手动 lock()/unlock(),功能更灵活。

展开解析:主要区别有四点——

  • 用法:synchronized 修饰方法或代码块,异常时自动释放锁;ReentrantLock 必须在 finally 中显式 unlock(),忘了释放会死锁。
  • 功能:ReentrantLock 支持可中断获取(lockInterruptibly())、超时尝试(tryLock(timeout))、公平锁模式,还能绑定多个 Condition 实现分组等待唤醒;synchronized 只有一个等待队列(wait/notify)。
  • 实现:synchronized 依赖对象 Monitor 且有锁升级优化;ReentrantLock 基于 AQS 实现。
  • 性能:JDK 6 之后 synchronized 优化充分,二者差距不大。

实践建议:普通场景优先 synchronized(写法简洁、不易出错);需要超时、可中断、公平性或多条件队列时才选 ReentrantLock。追问方向:公平锁为什么吞吐更低、Condition 与 wait/notify 的差异。