分布式锁redisson的中断操作

news2025/7/20 7:30:45

1、先贴代码

@RequestMapping(value = "/update", method = RequestMethod.POST)
    @ResponseBody
    public Result update(@RequestBody Employee employee) {
//        修改数据库(存在线程不安全 需要使用redison设置分布式锁 防止被修改)
//      设置分布式锁
        RLock lock = redissonClient.getLock("Lock:employ:"+employee.getId());
        try {
            if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
                try {
                    Employee employee1 = employeeService.getById(employee.getId());
                    if (employee1 == null) {
                        return Result.error("没有该员工");
                    }
                    boolean b = employeeService.updateById(employee);
                    if(b)
                    {
                        //            删除缓存
                        Boolean delete = redisTemplate.delete("employee" + employee.getId());
                        if(!delete){
                            return Result.error("缓存删除失败");
                        }
                        System.out.println("缓存删除成功");
                        return Result.success(employee,"员工信息修改成功");
                    }
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    // 关键:检查当前线程是否持有锁,避免误释放
                    if (lock.isHeldByCurrentThread()) {
                        lock.unlock();
                    }
                }
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return Result.error("获取锁被中断");
        }
        return Result.error("获取锁失败");
    }

2、说明中断

catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return Result.error("获取锁被中断");
        }

为什么要写这个,因为中断异常会很常见

下面是AI生成的 简单来讲:

1、主动被中断 2、线程池提前关闭(这个常见点 比如线程池的shutdown和shutdownnow(强制关闭),线程被中断)3、用户操作(比如取消操作)

1. 线程被其他线程主动中断

当其他线程调用当前线程的 interrupt() 方法时,tryLock(10, 30, TimeUnit.SECONDS) 会立即抛出 InterruptedException

 

示例场景

 

java

// 主线程
Thread updateThread = new Thread(() -> {
    employeeController.update(employee); // 调用更新接口
});
updateThread.start();

// 5秒后取消操作
Thread.sleep(5000);
updateThread.interrupt(); // 中断更新线程,触发InterruptedException
 

可能的业务场景

 
  • 用户点击 "取消" 按钮,中断正在执行的更新操作。
  • 系统资源紧张时,通过线程池的 shutdownNow() 中断所有正在执行的任务。

2. 线程池关闭时中断任务

如果你使用线程池执行更新操作,调用 ExecutorService.shutdownNow() 会向所有线程发送中断信号。

 

示例

 

java

ExecutorService executor = Executors.newFixedThreadPool(10);
Future<?> future = executor.submit(() -> {
    employeeController.update(employee); // 在线程池中执行更新
});

// 关闭线程池并中断未完成的任务
executor.shutdownNow(); // 触发所有线程的InterruptedException

3. 超时控制中的中断

虽然 tryLock(10, 30, TimeUnit.SECONDS) 的超时是由 Redisson 内部实现的,但如果在等待期间线程被外部中断,仍会抛出异常。

 

示例

 

java

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Thread currentThread = Thread.currentThread();

// 设置超时任务:1秒后中断当前线程
scheduler.schedule(() -> currentThread.interrupt(), 1, TimeUnit.SECONDS);

// 尝试获取锁,但1秒后会被中断
lock.tryLock(10, 30, TimeUnit.SECONDS); // 1秒后抛出InterruptedException

4. 在你的代码中的处理逻辑

当 tryLock() 被中断时,你的代码会:

 
  1. 恢复中断状态:Thread.currentThread().interrupt()
  2. 返回错误结果:Result.error("获取锁被中断")
 

这确保了:

 
  • 调用者知道操作被中断
  • 锁不会被误释放(因为未获取到锁)
  • 线程的中断状态被正确标记,便于上层代码处理

总结

InterruptedException 在以下场景最可能出现:

 
  1. 用户主动取消操作(通过前端或管理接口触发)
  2. 系统资源回收(如线程池关闭)
  3. 超时控制(通过定时任务中断长时间运行的操作)
 

虽然在普通的业务流程中可能较少遇到,但在高并发、需要精细控制资源的系统中,这种中断处理是必要的。

3、说说redisson中出现的问题,以及解决方案:

引入了redis和redisson一直报错 连不上redis(其实连的上)

解决过程:

1、第一次用,不熟悉redis、redisson和配置文件 以为只需要配置一个redis的ip和端口公用
出现了上述问题

2、直接找一个redisson相关github项目自己跑 对比区别 发现配置文件错误(竟然有两个IP地址)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker:安装配置教程(最新版本)

文章目录 一、前言二、具体操作2.1 卸载 Docker (可选)2.2 重新安装&#xff08;使用清华大学镜像&#xff09;2.3 配置轩辕镜像加速2.4 Docker 基本命名2.5 测试是否成功 三、结语 一、前言 Docker 是一种容器化技术&#xff0c;在软件开发和部署中得到广泛的应用&#xff0c…

neo4j官方示例

目录 一、准备数据 1.执行查看结果 二、操作 1.find 单个节点 2.同上&#xff0c;已某个属性去查询 3. 指定查询个数 4.条件查询 5.查询某个人出演的电影汇总 6.查询tom出演的电影中&#xff0c;还有其他演员的信息。 7.查询跟电影(Cloud Atlas)有关的演员&#xff0…

前端自学入门:HTML 基础详解与学习路线指引

在互联网的浪潮中&#xff0c;前端开发如同构建数字世界的基石&#xff0c;而 HTML 则是前端开发的 “入场券”。对于许多渴望踏入前端领域的初学者而言&#xff0c;HTML 入门是首要挑战。本指南将以清晰易懂的方式&#xff0c;带大家深入了解 HTML 基础&#xff0c;并梳理前端…

vue实现与后台springboot传递数据【传值/取值 Axios 】

vue实现与后台springboot传递数据【传值/取值】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a;每…

【英语笔记(三)】介绍谓语动词的分类,初步讲解四种基本状态:一般、进行、完成、完成进行

1. 五大类谓语动词 2. 谓语动词分类 3. 动词时间 过去--------------------------现在-----------------------未来 3. 动词状态 3.1 进行状态 3.2 完成状态 3.3 完成进行状态 3.4 一般状态 4. 时间 状态 名称说明例句现在现在现在现在进行时态现在某物正在做什么事情一只…

【Python】让Selenium 像Beautifulsoup一样,用解析HTML 结构的方式提取元素!

我在使用selenium的find_element的方式去获取网页元素&#xff0c;一般通过xpath、css_selector、class_name的方式去获取元素的绝对位置。 但是有时候如果网页多了一些弹窗或者啥之类的&#xff0c;绝对位置会发生变化&#xff0c;使用xpath等方法&#xff0c;需要经常变动。…

2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用

一、创建请求封装目录 选中自己的项目&#xff0c;右键鼠标---->新建---->目录---->名字自定义【我的是api】 二、创建两个js封装文件 选中封装的目录&#xff0c;右键鼠标---->新建---->js文件---->名字自定义【我的两个js文件分别是my_http和my_api】 三…

Ascend的aclgraph(二)_npu_backend中还有些什么秘密?

1 _npu_backend 文章还是从代码开始 import torch_npu, torchair config torchair.CompilerConfig() # 设置图下沉执行模式 config.mode "reduce-overhead" npu_backend torchair.get_npu_backend(compiler_configconfig) opt_model torch.compile(model, back…

ventoy安全启动怎么选_ventoy安全启动支持是开还是关

ventoy安全启动怎么选&#xff1f;Ventoy新一代多系统启动U盘解决方案。国产开源U盘启动制作工具&#xff0c;支持Legacy BIOS和UEFI模式&#xff0c;理论上几乎支持任何ISO镜像文件&#xff0c;支持加载多个不同类型的ISO文件启动&#xff0c;无需反复地格式化U盘&#xff0c;…

CC53.【C++ Cont】二分查找的普通模版

目录 1.知识回顾 2.关键点 特点 三个模版 普通的模版(有局限) 以LeetCode上的一道题为例:704. 二分查找 分析 引入二段性:分两段,舍一段,操作另一段(这个是二分查找的本质!) 代码 提交结果 当然也可以使用随机数来分两段 普通模版总结 1.知识回顾 之前在C语言专栏…

【优选算法 | 链表】链表操作技巧:常见算法

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口二分查找前缀和位运算模拟 链表是一种灵活的数据结构&#xff0c;广泛用于需要频繁插入和删除的场景。掌握链表的常见操作技巧&#xff0c;如插入、删除、翻转和合并等&#xff0c;能帮助开发者更…

w~大模型~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/13284996 #VideoMamba 视频理解因大量时空冗余和复杂时空依赖&#xff0c;同时克服两个问题难度巨大&#xff0c;CNN 和 Transformer 及 Uniformer 都难以胜任&#xff0c;Mamba 是个好思路&#xff0c;让我们看看本文是…

PBR材质-Unity/Blender/UE

目录 前言&#xff1a; 一、Unity&#xff1a; 二、Blender&#xff1a; 三、UE&#xff1a; 四、全家福&#xff1a; 五、后记&#xff1a; 前言&#xff1a; PBR流程作为表达物理效果的经典方式&#xff0c;很值得一学。纹理贴图使用的是上一期的Textures | cgbookcas…

websocketpp 安装及使用

介绍 WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的消息推送机制。 传统的 web 程序都是属于 "一问一答" 的形式&#xff0c;即客户端给服务器发送了一个 HTTP 请求&#xff0c;服务器给客户端返回一个 HTTP 响应。这种情况下服务器是属于被动…

第8章-2 查询执行的基础

上一篇&#xff1a;《第8章-1 查询性能优化-优化数据访问》&#xff0c;接着来了解查询执行的过程&#xff0c;这个对sql执行有个更直观的了解。 查询执行的基础 当希望MySQL能够以更高的性能运行查询时&#xff0c;最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解…

java面试OOM汇总

在正式 Minor GC 前&#xff0c;JVM 会先检查新生代中对象&#xff0c;是比老年代中剩余空间大还是小。假如 Minor GC之后 Survivor 区放不下剩余对象&#xff0c;这些对象就要进入老年代 老年代剩余空间大于新生代中的对象大小&#xff0c;那就直接 Minor GC&#xff0c; GC 完…

react-diff-viewer 如何实现语法高亮

前言 react-diff-viewer 是一个很好的 diff 展示库&#xff0c;但是也有一些坑点和不完善的地方&#xff0c;本文旨在描述如何在这个库中实现自定义语法高亮。 Syntax highlighting is a bit tricky when combined with diff. Here, React Diff Viewer provides a simple rend…

自定义prometheus exporter实现监控阿里云RDS

# 自定义 Prometheus Exporter 实现多 RDS 数据采集## 背景1. Prometheus 官网提供的 MySQL Exporter 对于 MySQL 实例只能一个进程监控一个实例&#xff0c;数据库实例很多的情况下&#xff0c;不方便管理。 2. 内部有定制化监控需求&#xff0c;RDS 默认无法实现&#xff0c;…

【计算机网络】--tcp三次握手

文章目录 示意图&#xff1a;抓包结果&#xff1a;第一次握手&#xff08;Client → Server&#xff09;第二次握手&#xff08;Server → Client&#xff09;第三次握手&#xff08;Client → Server&#xff09;为什么是三次握手 不是两次或者四次 示意图&#xff1a; 抓包结…

UI-TARS: 基于视觉语言模型的多模式代理

GitHub&#xff1a;https://github.com/bytedance/UI-TARS 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI 基于视觉语言模型&#xff08;Vision-Language Model&#xff09;的 GUI 代理应用&#xff0c;允许用户通过自然语言控制电脑操…