Java 多线程加锁 synchronized 关键字 字符串当做key

项目需求,在审核的时候,会有多个管理员进行审核。

但是如果多个管理员审核的时候会出现多个人修改一条数据,从而产生脏数据。

直接上代码:

java 复制代码
public class ServiceImpl implements IService {

    // 全局静态变量,用于存储锁的钥匙
    private static final ConcurrentHashMap<String, Object> lockMap = new ConcurrentHashMap<>();
    


    /**
     * 审核
     */
    @Override
    @Transactional
    public Boolean state(StateBo bo) {
        // 这里我用审核表的id作为钥匙
        if (lockMap.containsKey(String.valueOf(bo.getId()))) {
            throw new ServiceException("该记录正在审核中!", HttpStatus.HTTP_BAD_REQUEST);
        }
        // 封装一个密钥的对象
        Object lock = lockMap.computeIfAbsent(String.valueOf(bo.getId()), k -> new Object());
        synchronized (lock) {
            // DOTO 业务逻辑
            
            // 输出当前容器中的锁
            lockMap.forEach((k, v) -> System.out.println("当前键:"+k+"当前值:"+v));
        }
        return true;

    }


    /**
     * 移除锁
     * @param key
     */
    @Override
    public void removeLockMap(String key) {
        lockMap.remove(key);
    }



}

这里需要注意的是,如果你的方法有事务,你的锁就要将事务内的所有代码都要圈起来。

当然为了效率是最好是锁的代码越少越好!

相关推荐
昂好的day2 分钟前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
Java后端的Ai之路4 分钟前
01、Java并发编程:学习攻略如何才能学好并发编程?
java·开发语言·学习
ScilogyHunter21 分钟前
Hercules系列安全MCU功能安全原理详解
java·单片机·安全·hercules
博风40 分钟前
eclipse中配置maven,以及在本地使用maven。
java·eclipse·maven
云-缩影41 分钟前
实际项目中怎么选排序算法:从面试题到工程落地
java·算法·排序算法
追星星の人43 分钟前
java web项目(eclipse软件)全流程备份
java·servlet
OxYGC43 分钟前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说1 小时前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
李纲明1 小时前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy