Redisson分布式鎖解鎖異常問題
問題現(xiàn)象
程序中的redission執(zhí)行unlock()報錯如下:
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id:
從報錯信息可知:嘗試解鎖,而不是由當前線程按節(jié)點 ID 鎖定
問題復現(xiàn)
//獲取鎖對象
RLock lock = redissonClient.getLock(key);
try{
//獲取鎖
boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
if (!tryLock) {
//拋出業(yè)務異常
}
}catch(){
//捕獲異常
}finally{
//解鎖
lock.unlock();
}排查過程
如上代碼,線程無論是否有獲取鎖,都是需要去執(zhí)行解鎖方法,當線程沒有獲得鎖,執(zhí)行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、優(yōu)化代碼
在執(zhí)行unlock()確保線程已經(jīng)獲得鎖
//獲取鎖對象
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{
//拋出業(yè)務異常
}catch(){
//捕獲異常
}finally{
//解鎖
lock.unlock();
}總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Redis全文搜索教程之創(chuàng)建索引并關聯(lián)源數(shù)據(jù)的教程
RediSearch提供了一種簡單快速的方法對 hash 或者 json 類型數(shù)據(jù)的任何字段建立二級索引,然后就可以對被索引的 hash 或者 json 類型數(shù)據(jù)字段進行搜索和聚合操作,這篇文章主要介紹了Redis全文搜索教程之創(chuàng)建索引并關聯(lián)源數(shù)據(jù),需要的朋友可以參考下2023-12-12

