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

解锁的代码

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。