Redisson锁释放问题

young 76 2024-12-11

项目中经常会使用Redis作为分布式锁的实现,一般我们也是采用Redisson来直接使用其实现的分布式锁处理。

正常情况下,我们的代码一般是这样的

public void testLock(){
  RLock lock = redissonClient.getLock(LOCK_KEY);
  try{
    if(lock.tryLock(1,3,TimeUnit.SECONDS)){
      // do something
    }
  }catch(Exception e){
    // process exception
  }finally(
  	if(lock.isLocked()){
      lock.unlock();
    }
  )
}

但是这种写法会在释放锁的时候抛出异常:

attempt to unlock lock, not locked by current thread by node id:xxxxxxx thread-id: xxxx

当前线程企图去释放别的线程的锁

经查阅资料,Redisson的RLock提供了方法isHeldByCurrentThread(),用于判断锁是不是当前线程持有

因此,可以将代码改为

public void testLock(){
  RLock lock = redissonClient.getLock(LOCK_KEY);
  try{
    if(lock.tryLock(1,3,TimeUnit.SECONDS)){
      // do something
    }
  }catch(Exception e){
    // process exception
  }finally(
  	if(lock.isHeldByCurrentThread()){
      lock.unlock();
    }
  )
}

参考:https://mp.weixin.qq.com/s/PON360_3yQJCwXOKnPHZVQ