redisson 释放分布式锁 踩坑

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 48c213c9-1945-4c1b-821e-6d32e347eb44 thread-id: 69

出错代码:

java 复制代码
   private void insertHourLog(Timestamp lastHourStartTimeStamp) {
        RLock lock = redissonClient.getLock("hourLogLock");
        try {
            if (lock.tryLock(70, TimeUnit.SECONDS)) {
                QueryWrapper<TdengineHourLog> tdengineHourLogQueryWrapper = new QueryWrapper<>();
                tdengineHourLogQueryWrapper.eq("belong_time", lastHourStartTimeStamp);
                TdengineHourLog tdengineHourLog = tdengineHourLogMapper.selectOne(tdengineHourLogQueryWrapper);
                LocalDateTime currentDateTime = LocalDateTime.now();
                if (tdengineHourLog != null) {
                    tdengineHourLog.setTotal(tdengineHourLog.getTotal() + 1);
                    String statusMapString = tdengineHourLog.getStatus_map();
                    if (StrUtil.isNotEmpty(statusMapString)) {
                        HashMap statusMap = JSONUtil.toBean(statusMapString, HashMap.class);
                        statusMap.put(basicConfig.nodeName, currentDateTime);
                        tdengineHourLog.setStatus_map(JSONUtil.toJsonStr(statusMap));
                        tdengineHourLogMapper.updateById(tdengineHourLog);
                        log.info("更新hourLog");
                    } else {
                        HashMap<String, Object> statusMap = new HashMap<>();
                        statusMap.put(basicConfig.nodeName, currentDateTime);
                        tdengineHourLog.setStatus_map(JSONUtil.toJsonStr(statusMap));
                        tdengineHourLogMapper.updateById(tdengineHourLog);
                        log.info("更新hourLog");
                    }
                } else {
                    tdengineHourLog = new TdengineHourLog();
                    tdengineHourLog.setBelong_time(lastHourStartTimeStamp);
                    tdengineHourLog.setTotal(1);
                    HashMap<String, Object> statusMap = new HashMap<>();
                    statusMap.put(basicConfig.nodeName, currentDateTime);
                    tdengineHourLog.setStatus_map(JSONUtil.toJsonStr(statusMap));
                    tdengineHourLogMapper.insert(tdengineHourLog);
                    log.info("新增hourLog");
                }
                lock.unlock();
            } else {
                log.info("60s超时未获取到hourLogLock");
            }
        } catch (InterruptedException e) {
            log.error("插入hour_log日志出错", e);
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

最后的finally中的 lock.unlock()存在一种情况,即未获取锁的情况下,调用了 unlock 解锁方法

在finally 中加入如下判断即可

java 复制代码
  finally {
            if (lock.isLocked() && lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
相关推荐
程序猿阿伟4 小时前
《分布式追踪Span-业务标识融合:端到端业务可观测手册》
分布式
消失的旧时光-19436 小时前
第十六课实战:分布式锁与限流设计 —— 从原理到可跑 Demo
redis·分布式·缓存
若水不如远方6 小时前
分布式一致性(三):共识的黎明——Quorum 机制与 Basic Paxos
分布式·后端·算法
会算数的⑨7 小时前
Kafka知识点问题驱动式的回顾与复习——(一)
分布式·后端·中间件·kafka
张小凡vip7 小时前
Kafka--使用 Kafka Connect 导入/导出数据
分布式·kafka
回忆是昨天里的海7 小时前
kafka概述
分布式·kafka
知识即是力量ol7 小时前
初识 Kafka(一):分布式流平台的定义、核心优势与架构全景
java·分布式·kafka·消息队列
nbsaas-boot7 小时前
Pipeline + Saga 分布式扩展规范
分布式
creator_Li8 小时前
分布式IM聊天系统的消息可靠性
分布式·im
一条闲鱼_mytube8 小时前
《分布式事务实战完全指南》:从理论到实践
分布式