java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 48c213c9-1945-4c1b-821e-6d32e347eb44 thread-id: 69
出错代码:
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 中加入如下判断即可
finally {if (lock.isLocked() && lock.isHeldByCurrentThread()) {lock.unlock();}}