当前位置: 首页 > news >正文

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

基本概念

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 提供了更多的功能和灵活性。

http://www.zskr.cn/news/64006.html

相关文章:

  • 无源探头与高压探头技术对比分析
  • 2025年上海离婚诉讼律师推荐排行榜,哪个好?哪个靠谱?选哪个?
  • 2025留学中介南京哪家好
  • 2025年上海离婚谈判律师推荐排行榜,哪个好?哪个靠谱?选哪个?
  • 为你的STM32毕设项目加点料:AI智能风扇智能温控与风扇调节系统
  • 2025年重庆环境好的西点烘焙学校排行榜,设备先进口碑好的机
  • 2025年公路液压打桩机供货厂家权威推荐榜单:高速护栏立柱打桩机/马路护栏打桩机/道路打桩机源头厂家精选
  • CF1824C
  • 记游Noip
  • 2025年重庆西式餐饮教育机构排名,重庆欧米奇西点西餐学校的
  • 超强汇总!9款免费降AIGC神器让你告别AI写作痕迹 - BUAA
  • 洛谷 P2071:座位安排 ← 二分图 + 匈牙利算法 + 二分图最大匹配
  • ASCII 码表常用符号
  • 历年 CSP / NOIP 补题记录
  • 2025年营销咨询公司满意度、性价比、口碑排名:直线管理咨询
  • Windows Failover Cluster集群中的EventId 1196错误日志
  • 2025年国内五大靠谱管理咨询公司排名,直线管理咨询实力怎么
  • 从零打造 Telegram 中文生态:界面汉化 + 中文Bot + @letstgbot 搜索引擎整合实战 - 实践
  • 2025年北京离婚谈判律师推荐排行榜,哪个好?哪个靠谱?选哪个?
  • 免费CDN推荐:速度、安全、稳定长期选择的最优选择
  • 基于Qlearning强化学习的二阶弹簧动力学模型PID控制matlab性能仿真
  • 软件开发的下一个阶段
  • 2025成都市幼小衔接/小学托管/幼升小/拼音识字等机构最新top5推荐,培养专注力,优质教育机构、专业课程,助力儿童平稳过渡不费爸妈
  • 详细介绍:【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
  • 2025年长沙烘焙西点培训学校排行榜,精选烘焙西点培训学校推
  • 2025申请香港研究生的中介机构有哪些
  • 2025年热门的预应力金属波纹管设备卷管机厂家实力及用户口碑排行榜
  • 2025年热门的恒功率电伴热带厂家推荐及选购指南
  • 实用指南:单调栈的“降维打击”:从直方图到矩阵——再探「最大矩形」
  • Window Docker 安装MySQL8.0全流程 保姆级