Java并发编程:synchronized与ReentrantLock深度对比
·
synchronized与ReentrantLock对比分析
一、核心概念对比
| 对比维度 | synchronized | ReentrantLock | |----------------|---------------------------------------|-----------------------------------------------| | 锁类型 | JVM内置隐式锁 | 显式锁(java.util.concurrent) | | 获取释放 | 自动(进入/退出代码块时) | 手动(需显式调用lock/unlock) | | 可重入性 | 支持 | 支持 | | 公平性 | 非公平 | 可配置(构造函数设置fair参数) | | 中断响应 | 不可中断 | 可中断(支持lockInterruptibly()) | | 超时机制 | 不支持 | 支持(tryLock(timeout)) |
二、性能特性
// synchronized示例
public synchronized void method() {
// 线程竞争时可能引起阻塞
}
// ReentrantLock示例
ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 支持尝试锁机制
} finally {
lock.unlock();
}
}
三、典型应用场景
1. synchronized适用场景
- HashMap同步:
Collections.synchronizedMap(new HashMap<>()) - 线程池实现:ThreadPoolExecutor内部Worker线程控制
- 简单同步需求:无需复杂锁机制的业务场景
2. ReentrantLock适用场景
- 高并发场景:如电商秒杀系统库存扣减
- 复杂控制需求:银行转账超时重试机制
- 公平锁需求:排队系统按请求顺序处理
- 条件等待:使用Condition实现精准唤醒
四、性能对比数据
| 场景 | synchronized吞吐量 | ReentrantLock吞吐量 | |--------------------|--------------------|----------------------| | 低竞争(10线程) | 1200 TPS | 1180 TPS | | 高竞争(100线程) | 450 TPS | 980 TPS | | 有超时需求场景 | 不支持 | 支持(tryLock) | | 公平性控制场景 | 不支持 | 支持 |
更多推荐
所有评论(0)