Redisson分布式鎖解鎖異常問題
問題現(xiàn)象
程序中的redission執(zhí)行unlock()報錯如下:
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id:
從報錯信息可知:嘗試解鎖,而不是由當(dāng)前線程按節(jié)點 ID 鎖定
問題復(fù)現(xiàn)
//獲取鎖對象 RLock lock = redissonClient.getLock(key); try{ //獲取鎖 boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); if (!tryLock) { //拋出業(yè)務(wù)異常 } }catch(){ //捕獲異常 }finally{ //解鎖 lock.unlock(); }
排查過程
如上代碼,線程無論是否有獲取鎖,都是需要去執(zhí)行解鎖方法,當(dāng)線程沒有獲得鎖,執(zhí)行unlock()就會報
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id:錯誤
解決方案
1、在解鎖時增加判斷
//判斷要解鎖的key是否已被鎖定;判斷要解鎖的key是否被當(dāng)前線程持有 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è)務(wù)異常 }catch(){ //捕獲異常 }finally{ //解鎖 lock.unlock(); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis計數(shù)器與數(shù)量控制的實現(xiàn)
使用Redis計數(shù)器可以輕松地解決數(shù)量控制的問題,同時還能有效地提高應(yīng)用的性能,本文主要介紹了redis計數(shù)器與數(shù)量控制的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-12-12redis性能優(yōu)化之生產(chǎn)中實際遇到的問題及排查總結(jié)
這篇文章主要介紹了redis性能優(yōu)化之生產(chǎn)中實際遇到的問題及排查總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12