概述
现象
Redisson分布式锁报错:attempt to unlock lock, not locked by current thread by node id
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 193fa0a4-1df0-445f-8737-18b7bb464f64 thread-id: 80
redisson version:3.12.5
redis version:5.0.7
redis cluster mode: 3 master 3 slave deployed in vm
question descript:
In my production environment, a thread(dubheTaskExecutor-pool-2-thread-836) hangs up forever whe invokes RedissonLock.unlock() . And I never found any error in my application log. I am desired to find out if is a bug in redisson 3.12.5.The thread dump file is below(core part) :
"dubheTaskExecutor-pool-2-thread-836" #12180 prio=5 os_prio=0 tid=0x00007f9bc003b000 nid=0x38a6 in Object.wait() [0x00007f9c660de000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at io.netty.util.concurrent.DefaultPromise.await(DefaultPromise.java:252)
- locked <0x00000006a4b32a10> (a io.netty.util.concurrent.ImmediateEventExecutor$ImmediatePromise)
at org.redisson.misc.RedissonPromise.await(RedissonPromise.java:110)
at org.redisson.misc.RedissonPromise.await(RedissonPromise.java:35)
at org.redisson.command.CommandAsyncService.get(CommandAsyncService.java:139)
at org.redisson.RedissonObject.get(RedissonObject.java:90)
at org.redisson.RedissonLock.unlock(RedissonLock.java:477)
at com.sf.beic.common.autoconfig.redisson.DistributedLockerImpl.unlock(DistributedLockerImpl.java:57)
at com.sf.beic.common.autoconfig.redisson.RedissonDistributedLockerUtil.unlock(RedissonDistributedLockerUtil.java:37)
at com.sf.dubhe.pay.gateway.task.ThirdTransferQueryTask$1.run(ThirdTransferQueryTask.java:162)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
解决方案
lock.isLocked():判断要解锁的key是否已被锁定。
lock.isHeldByCurrentThread():判断要解锁的key是否被当前线程持有。
public void unlockSingle(String lockKey, String user) {
RLock lock = redissonClient.getLock(lockKey);
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
参考
Redisson分布式锁报错:attempt to unlock lock, not locked by current thread by node idl
Redisson 3.12.5 unlock hang forever #3393
使用redisson遇到的坑
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99939.html