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



}

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

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

相关推荐
啊阿狸不会拉杆6 分钟前
《Java 程序设计》核心知识点梳理与深入探究
java·开发语言·python·算法·php·intellij-idea
三小尛9 分钟前
C++拷贝构造函数
开发语言·c++
源力祁老师12 分钟前
外部系统获取Odoo数据最便捷的方式
开发语言·前端·javascript
盖世英雄酱5813624 分钟前
事务报错,为何数据还是插入成功了❓
java·数据库·后端
it自26 分钟前
Redisson在Spring Boot项目中的集成与实战
java·spring boot·redis·后端·缓存
GISer_Jing29 分钟前
下次接好运~
开发语言·javascript·ecmascript
傻啦嘿哟40 分钟前
代理IP并发控制:多线程爬虫的加速引擎
开发语言·php
一只余弦函数1 小时前
《C++》STL--list容器详解
开发语言·c++·list
一勺-_-1 小时前
全栈:怎么把IDEA和Maven集成一下?
java·maven·intellij-idea
燕山石头1 小时前
解决 IntelliJ IDEA Build时 Lombok 不生效问题
java·前端·intellij-idea