特性
| synchronized
| ReentrantLock
|
实现方式
| 隐式加锁,Java 编译器在编译时自动处置处罚。
| 显式加锁,必要手动调用 lock()
和 unlock()
。
|
锁粒度
| 锁定整个方法或代码块,无法精确控制。
| 可以精确控制锁定的范围,答应更机动的锁定操纵。
|
性能
| 相对较低,特别是在高并发环境下,由于 JVM 的锁优化不足,可能导致性能瓶颈。
| 在高并发时,ReentrantLock
性能优于 synchronized
,尤其在锁竞争激烈时。
|
中断支持
| 不支持中断,线程获取锁时无法响应中断。
| 支持中断,可以使用 lockInterruptibly()
来在等候锁时响应中断。
|
公平性
| 非公平锁,线程不一定按照哀求的顺序获取锁。
| 可以选择公平锁或非公平锁。使用构造函数 new ReentrantLock(true)
来创建公平锁。
|
死锁制止
| 必要小心死锁问题,synchronized
无法制止死锁。
| 通过 ReentrantLock
提供的 tryLock()
方法和超时机制可以更机动地制止死锁。
|
锁释放机制
| 锁由 JVM 自动管理,方法实行完后自动释放。
| 必须手动调用 unlock()
释放锁,通常与 try...finally
语句配合使用。
|
可重入性
| 支持,可同一线程多次获取同一锁。
| 支持,可同一线程多次获取同一锁。
|
性能监控
| 无法直接获取锁的状态。
| 可以通过 getHoldCount()
获取当火线程持有锁的次数,举行监控。
|
锁升级
| 不支持锁的升级(无法从轻量级锁升级为重量级锁)。
| 可以通过锁的竞争情况动态升级为不同的锁类型(如偏向锁、轻量锁、重量锁)。
|