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 分钟前
GstAggregator的aggregate
开发语言·前端·javascript·gstreamer
愤豆2 分钟前
10-Java语言核心-JVM原理--字节码与执行引擎详解
java·jvm·python
南境十里·墨染春水3 分钟前
C++传记 详解单例模式(面向对象)
开发语言·c++·单例模式
番茄去哪了5 分钟前
Retrofit框架调用第三方api
java·服务器·retrofit
cui_ruicheng9 分钟前
C++智能指针:从 RAII 到 shared_ptr 源码实现
开发语言·c++
xuhaoyu_cpp_java10 分钟前
XML学习
xml·java·笔记·学习
爱丽_11 分钟前
AQS 的 CLH 同步队列:入队/出队、park/unpark 与“公平性”从哪来
java·开发语言·jvm
共享家952711 分钟前
实现简化的高性能并发内存池
开发语言·数据结构·c++·后端
黄昏恋慕黎明11 分钟前
spring的IOC与DI
java·后端·spring
千里马学框架12 分钟前
aospc/c++的native 模块VScode和Clion
android·开发语言·c++·vscode·安卓framework开发·clion·车载开发