IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 在springboot中使用synchronized锁失效的问题 -> 正文阅读

[Java知识库]在springboot中使用synchronized锁失效的问题

最近在实现博客系统的markdown文章导入功能的时候,遇到了多并发的问题,主要是导入插件是element-plus提供的,然后进行批量上传的时候,实际上是同一时间发送多次上传请求,也就出现了多并发的情况。本以为使用synchronized就可以处理的,结果还是一个知识点!!!

相关代码

    public  MlogTags saveIfAbsent(@NotNull(message = "标签名称不能为空") String tagName) {
	//从数据库获取标签,判断标签是否存在,如果不存在就新增,否则返回存在的标签信息   
 	Optional<MlogTags> tags = getByName(tagName);
        MlogTags tag;
        if (tags.isEmpty()) {
            tag = new MlogTags();
            tag.setTag(tagName);
            tag.setColor(Constant.DEFAULT_COLOR);
            save(tag);
        } else {
            tag = tags.get();
        }
        return tag;
    }

上面的代码会导致当多并发出现的时候,就会出现save方法还未执行,另一个请求已经执行完getByName这个方法,然后就会保存多份相同的标签。

考虑到是博客系统,直接使用synchronized加锁即可。

//加上synchronized
   public synchronized MlogTags saveIfAbsent(@NotNull(message = "标签名称不能为空") String tagName) {
	//从数据库获取标签,判断标签是否存在,如果不存在就新增,否则返回存在的标签信息   
 	Optional<MlogTags> tags = getByName(tagName);
        MlogTags tag;
        if (tags.isEmpty()) {
            tag = new MlogTags();
            tag.setTag(tagName);
            tag.setColor(Constant.DEFAULT_COLOR);
            save(tag);
        } else {
            tag = tags.get();
        }
        return tag;
    }

本以为加上就可以搞定了,但是问题依旧存在,锁没有生效。

具体原因

因为我是其他的方法在调用saveIfAbsent这个方法。因为导入操作要保证一致性,所以开启了事务管理,spring事务管理会在方法执行前生成一个代理类,通过代理类去执行,所以导致每次加锁,加的是每次生成的代理类上面的代码块。


    @Override
    @Transactional(rollbackFor = Exception.class)//开启aop事务管理
    public  Boolean importMarkdown(MultipartFile file, HttpServletRequest request) {
  	//解析md生成文章对象
         ArticleDTO article = parseMdFile(file);
        //保存文章标签信息
        saveIfAbsent(article.getTag());
	......其他业务代码
        return true;
    }

处理方式

在开启事务前加锁即可,即调用importMarkdown方法之前,进行加锁即可

    synchronized (this) {
             articleService.importMarkdown(file, request);
        }

参考资料

Spring事务管理下synchronized锁失效问题

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:11:18  更:2022-04-01 23:15:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:40:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码