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

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

    解锁的代码

    打赏 评论
  • 有问必答小助手 2021-09-22 09:41

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


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


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

    打赏 评论

相关推荐 更多相似问题