项目中经常会使用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