当前位置: 代码网 > it编程>数据库>Redis > Redisson分布式锁解锁异常问题

Redisson分布式锁解锁异常问题

2024年12月25日 Redis 我要评论
问题现象程序中的redission执行unlock()报错如下:java.lang.illegalmonitorstateexception: attempt to unlock lock, not

问题现象

程序中的redission执行unlock()报错如下:

java.lang.illegalmonitorstateexception: attempt to unlock lock, not locked by current thread by node id:

从报错信息可知:尝试解锁,而不是由当前线程按节点 id 锁定

问题复现

//获取锁对象
rlock lock = redissonclient.getlock(key);

try{
   //获取锁
   boolean trylock = lock.trylock(5, timeunit.seconds);
   if (!trylock) {
   //抛出业务异常
   }
}catch(){
    //捕获异常
}finally{
    //解锁
    lock.unlock();
}

排查过程

如上代码,线程无论是否有获取锁,都是需要去执行解锁方法,当线程没有获得锁,执行unlock()就会报

java.lang.illegalmonitorstateexception: attempt to unlock lock, not locked by current thread by node id:错误

解决方案

1、在解锁时增加判断

//判断要解锁的key是否已被锁定;判断要解锁的key是否被当前线程持有
if (lock.islocked() && lock.isheldbycurrentthread()) {
    lock.unlock();
}

2、优化代码

在执行unlock()确保线程已经获得锁

//获取锁对象
rlock lock = redissonclient.getlock(key);
boolean trylock;
try {
    trylock = lock.trylock(5, timeunit.seconds);
} catch (interruptedexception e) {
    throw new exception("获取分布式锁失败,请稍后再试");
}

if (!trylock) {
    throw new exception("请稍后再试");
}

try{
   //抛出业务异常
}catch(){
    //捕获异常
}finally{
    //解锁
    lock.unlock();
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com