肉末茄子& 2021-09-17 18:12 采纳率: 0%
浏览 41
已结题

redis分布式锁 解锁的时候发现锁已经被别的线程写入了

public boolean Lock(String key, Date date)  {
        String key1 = "lock:" + key;
        long time = 5000L;
        Boolean flag = false;
        long maxTime = System.currentTimeMillis()+ DefaultMaxWaitTime;
        for (; ; ) {
            if (System.currentTimeMillis() > maxTime) {
                throw new RuntimeException("系统繁忙");
            }
            redisTemplate.setKeySerializer(redisTemplate.getStringSerializer());
            flag = redisTemplate.opsForValue().setIfAbsent(key1, date.toString() + Thread.currentThread().getId(), time, TimeUnit.MILLISECONDS);
            if (flag&&(date.toString() + Thread.currentThread().getId()).equals(redisTemplate.opsForValue().get(key1))) {
                break;
            } else {
                try {
                    Thread.sleep(new Random().nextInt(10));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        if (!flag){
            throw new RuntimeException(Thread.currentThread().getId()+"异常跳出   当前锁为==>"+redisTemplate.opsForValue().get(key1)+"加锁内容为:==>"+date.toString() + Thread.currentThread().getId());
        }
        getWatchDog(key, date, String.valueOf(Thread.currentThread().getId()));
        return flag;
    }
  • 写回答

2条回答 默认 最新

  • 肉末茄子& 2021-09-17 18:15
    关注
     public boolean UnLock(String key, Date date) {
            String key1 = "lock:" + key;
            System.out.println(Thread.currentThread().getId()+"释放锁");
            if ((date.toString() + Thread.currentThread().getId()).equals(redisTemplate.opsForValue().get(key1))) {
                redisTemplate.delete(key1);
                return true;
            }
            throw new RuntimeException("解锁失败 请检查锁是否正确 ===  >" + date.toString() + Thread.currentThread().getId() + "      " + redisTemplate.opsForValue().get(key1));
        }
    
    

    解锁的代码

    评论

报告相同问题?

问题事件

  • 系统已结题 9月25日
  • 创建了问题 9月17日

悬赏问题

  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝