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) | | 公平性控制场景 | 不支持 | 支持 |

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐