
| synchronized | ReentrantLock | |
|---|---|---|
| 实现方式 | Java关键字(JVM 实现) | Lock 实现类(JDK 实现) |
| 适用范围 | 可修改方法或代码块 | 只能用于代码块 |
| 锁类型 | 可重入锁 | |
| 非公平锁 | 可重入锁 | |
| 默认非公平锁 | ||
| 也可以设置成公平锁 | ||
| 获取锁方式 | 自动获取锁 | 使用 lock() 手动获取锁 |
| 释放锁方式 | 自动释放锁 | 使用 unlock() 手动释放锁 |
| 释放锁操作务必放在 finally 中 | ||
| 状态获取 | 不能获取锁状态 | 可以获取锁状态 |
| 超时设置 | 不能设置超时时间 | 可以设置超时时间 |
| 响应中断 | 不能响应中断 | |
| 等待的线程会一直等待下去 | 使用 lockInterruptibly() 可以响应中断 | |
| 等待队列 | 只有一个等待队列 | 可以对应多个等待队列 |
| 主要优势 | 使用简单 | |
| 完全交给 JVM 处理,可靠性高 | 比较灵活 | |
| 在高并发场景下,性能较好 |