reentrantlock 提供显式锁管理、可中断等待、超时获取、公平性选择和多 condition 精确唤醒,支持细粒度并发控制;可通过分段锁、哈希锁桶、复用锁实例及 trylock 降级提升性能与响应性。

ReentrantLock 通过显式锁管理、可中断等待、超时获取、公平性选择和条件队列,支持比 synchronized 更细粒度的并发控制。
按业务逻辑拆分独立锁
避免全局大锁,为不同资源或数据段分配单独的 ReentrantLock 实例。例如在缓存系统中,对不同 key 的缓存项使用分段锁(类似 ConcurrentHashMap 的 Segment 思路),或用 ConcurrentHashMap
- 每个用户会话维护一个专属锁,避免多请求串行化同一用户操作
- 订单服务中,按 orderID 哈希取模分配到 N 个锁桶,减少锁竞争
- 注意锁对象不能是临时对象或基本类型包装类(如 new Integer(1)),应复用固定实例
配合 tryLock 实现非阻塞与超时控制
使用 tryLock() 跳过等待,或指定超时时间避免无限阻塞,适合响应敏感型场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- if (lock.tryLock(100, TimeUnit.MILLISECONDS)) { ... } else { /* 降级处理 */ }
- 结合重试机制:失败后短暂休眠再尝试,避免忙等
- 不适合强一致性要求必须加锁的场景,需评估业务容忍度
利用 Condition 精确唤醒等待线程
ReentrantLock 可创建多个 Condition 对象,实现“只唤醒关心某类事件的线程”,替代 Object.wait/notify 的粗粒度唤醒:
- 生产者-消费者模型中,分别定义 notFull 和 notEmpty 两个 condition
- 消费者调用 notEmpty.await() 后,仅当有新元素时被 notFull.signal() 唤醒
- 避免 synchronized 中 notifyAll() 带来的无效唤醒和竞争
选择公平锁需权衡吞吐与响应
构造时传入 true 启用公平模式,使等待最久的线程优先获取锁:
- 公平锁降低线程饥饿概率,适合任务执行时间差异大、对响应时间敏感的场景
- 但会显著降低吞吐量(约 2–3 倍性能下降),因需维护 FIFO 队列并频繁 CAS 操作
- 默认非公平锁更高效,适用于多数高并发、任务轻量的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










