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);
    }



}

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

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

相关推荐
yw00yw15 分钟前
常见的设计模式
开发语言·javascript·设计模式
我们从未走散16 分钟前
设计模式学习笔记-----抽象责任链模式
java·笔记·学习·设计模式·责任链模式
二十雨辰36 分钟前
[TG开发]部署机器人
java·web3
zjjuejin39 分钟前
告别低效:我用这招,让Go和Java项目的依赖管理又快又稳
java
我不是星海1 小时前
RabbitMQ基础入门实战
java·开发语言
设计师小聂!1 小时前
RabbitMQ详解
java·spring boot·分布式·rabbitmq·maven
花开富贵ii1 小时前
代码随想录算法训练营四十九天|图论part07
java·数据结构·算法·图论·prim·kruscal
渣哥1 小时前
Java中wait()和sleep()方法到底差在哪?通俗解释
java
AAA修煤气灶刘哥1 小时前
定时任务从入门到防坑,cron 表达式看这篇就够
java·后端
jingfeng5141 小时前
C++多态
开发语言·c++