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



}

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

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

相关推荐
阿猿收手吧!2 分钟前
【C++】异步编程:std::async终极指南
开发语言·c++
figo10tf6 分钟前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva9 分钟前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
橙露14 分钟前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
小程故事多_8015 分钟前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
冰暮流星15 分钟前
sql语言之分组语句group by
java·数据库·sql
沐知全栈开发16 分钟前
SQL 日期处理指南
开发语言
望舒51317 分钟前
代码随想录day25,回溯算法part4
java·数据结构·算法·leetcode
黎雁·泠崖19 分钟前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
黎雁·泠崖24 分钟前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言