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