尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

ReentrantLock 的典型使用场景和实现方法

ReentrantLock 的典型使用场景和实现方法
📅 发布时间:2026/7/22 9:41:14

基本概念

ReentrantLock 是 Java 幑发包中提供的可重入互斥锁,相比 synchronized 关键字提供了更高的灵活性和功能。

典型使用场景

1. 防止重复提交

防止用户重复点击按钮导致的重复业务处理。

2. 缓存双检锁机制

在缓存失效时,防止多个线程同时重建缓存。

3. 资源竞争控制

对共享资源的访问进行精确控制。

4. 定时任务并发控制

确保同一时刻只有一个定时任务实例运行。

实现方法

方法一:在 Service 层直接使用

@Service
public class BusinessService {private final ReentrantLock lock = new ReentrantLock();public void processBusinessLogic(String key) {lock.lock();try {// 执行核心业务逻辑doSomething(key);} finally {lock.unlock();}}private void doSomething(String key) {// 具体业务实现}
}

方法二:使用静态 Map 管理多个锁

@Service
public class MultiKeyService {private static final Map<String, ReentrantLock> lockMap = new ConcurrentHashMap<>();public void processByKey(String key) {ReentrantLock lock = lockMap.computeIfAbsent(key, k -> new ReentrantLock());lock.lock();try {// 处理特定 key 的业务逻辑handleBusiness(key);} finally {lock.unlock();}}private void handleBusiness(String key) {// 具体业务实现}
}

方法三:封装为工具类使用

@Component
public class LockUtil {private static final Map<String, ReentrantLock> lockMap = new ConcurrentHashMap<>();public <T> T executeWithLock(String key, Supplier<T> supplier) {ReentrantLock lock = lockMap.computeIfAbsent(key, k -> new ReentrantLock());lock.lock();try {return supplier.get();} finally {lock.unlock();}}public void executeWithLock(String key, Runnable runnable) {ReentrantLock lock = lockMap.computeIfAbsent(key, k -> new ReentrantLock());lock.lock();try {runnable.run();} finally {lock.unlock();}}
}// 使用示例
@Service
public class BusinessService {@Autowiredprivate LockUtil lockUtil;public void processData(String key) {lockUtil.executeWithLock(key, () -> {// 执行业务逻辑doProcess(key);});}
}

方法四:使用 tryLock 避免阻塞

@Service
public class TimeoutControlService {private final ReentrantLock lock = new ReentrantLock();public boolean processWithTimeout() {try {if (lock.tryLock(3, TimeUnit.SECONDS)) {try {// 执行业务逻辑doProcess();return true;} finally {lock.unlock();}}} catch (InterruptedException e) {Thread.currentThread().interrupt();}return false;}private void doProcess() {// 具体业务实现}
}

在 Spring Bean 中的注意事项

1. 锁的作用域

@Service
public class SingletonService {// 实例变量 - 同一个锁对象private final ReentrantLock lock = new ReentrantLock();// 每次调用创建新锁 - 锁失效// private ReentrantLock getLock() { return new ReentrantLock(); }
}

2. 异常处理

@Service
public class ExceptionSafeService {private final ReentrantLock lock = new ReentrantLock();public void safeProcess() {lock.lock();try {// 业务逻辑可能会抛出异常riskyOperation();} finally {// 必须在 finally 中释放锁lock.unlock();}}
}

与 @Transactional 结合使用的注意事项

@Service
public class TransactionalLockService {private final ReentrantLock lock = new ReentrantLock();// 推荐:先加锁后开启事务public void correctWay() {lock.lock();try {transactionalMethod();} finally {lock.unlock();}}@Transactionalpublic void transactionalMethod() {// 数据库操作}
}

最佳实践总结

  1. 锁的粒度:根据业务需求合理设计锁的粒度
  2. 异常安全:始终在 finally 块中释放锁
  3. 避免死锁:统一加锁顺序,避免嵌套锁
  4. 性能考虑:对于竞争不激烈的场景,synchronized 可能更合适
  5. 监控告警:添加锁等待时间监控,及时发现性能瓶颈

ReentrantLock 在 Spring Boot 中主要用于需要更细粒度控制并发访问的场景,相比 synchronized 提供了更多的功能和灵活性。

相关新闻

  • 2025 年 11 月制造业降本增效咨询公司权威推荐榜:精益生产与成本优化专家团队深度解析及服务优势全景解析
  • 直击提分痛点!2025年11月贝赛思考试培训核心机构深度评测,封闭班首选推荐
  • 2025 年 11 月管理咨询公司权威推荐榜:战略规划与组织优化口碑优选,专业服务助力企业高效成长

最新新闻

  • 全栈开发者工具箱:提升效率的必备资源与工具
  • Current AI:构建开放AI基础设施的核心能力与部署实践
  • 2026 最新岳阳防水补漏全攻略:覆盖 3 区 4 县 2 市全街道 洞庭湖区与石化厂区避坑指南.doc - 资讯在线
  • 【2026-07】陕西汉中快速卷帘门不错的工厂哪个好?硬质卷帘门、硬质快速卷帘门优选——晟世佳品门窗 - 多才菠萝
  • 合肥瑶海 0-6 岁早教去哪?红黄蓝两大旗舰成长中心,测评 + 系统早教一站式育儿 - 博客万
  • YOLOv8优化实现高效有机果蔬智能检测系统

日新闻

  • AI云原生实战05-金融AI上云最难的不是技术,是“不出事“——TCE银行风控架构拆解
  • 2026年GEOSEO优化公司选型深度测评:五大硬核标准严选,这六家重塑搜索增长新格局 - 品牌前沿专家
  • **核验!2026年7月卡地亚香港**售后网点地址及服务电话公告 - 卡地亚服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号