Redisson分布式鎖解鎖異常問題
問題現(xiàn)象
程序中的redission執(zhí)行unlock()報錯如下:
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id:
從報錯信息可知:嘗試解鎖,而不是由當(dāng)前線程按節(jié)點(diǎn) 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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
- Redis分布式鎖的幾種實(shí)現(xiàn)方法
- 使用Redis實(shí)現(xiàn)分布式鎖的代碼演示
- Redis使用SETNX命令實(shí)現(xiàn)分布式鎖
- Redis分布式鎖使用及說明
- redis分布式鎖實(shí)現(xiàn)示例
- Redis 實(shí)現(xiàn)分布式鎖時需要考慮的問題解決方案
- Redis實(shí)現(xiàn)分布式鎖的示例代碼
- Redission實(shí)現(xiàn)分布式鎖lock()和tryLock()方法的區(qū)別小結(jié)
- 從原理到實(shí)踐分析?Redis?分布式鎖的多種實(shí)現(xiàn)方案
- Redis本地鎖和分布式鎖的區(qū)別小結(jié)
相關(guān)文章
利用Redis?lua實(shí)現(xiàn)高效讀寫鎖的代碼實(shí)例
這篇文章給大家介紹了如何利用Redis?lua實(shí)現(xiàn)高效的讀寫鎖,讀寫鎖的好處就是能幫助客戶讀到的數(shù)據(jù)一定是最新的,寫鎖是排他鎖,而讀鎖是一個共享鎖,需要的朋友可以參考下2024-01-01redis不能訪問本機(jī)真實(shí)ip地址的解決方案
這篇文章主要介紹了redis不能訪問本機(jī)真實(shí)ip地址的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07redis計數(shù)器與數(shù)量控制的實(shí)現(xiàn)
使用Redis計數(shù)器可以輕松地解決數(shù)量控制的問題,同時還能有效地提高應(yīng)用的性能,本文主要介紹了redis計數(shù)器與數(shù)量控制的實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-12-12redis性能優(yōu)化之生產(chǎn)中實(shí)際遇到的問題及排查總結(jié)
這篇文章主要介紹了redis性能優(yōu)化之生產(chǎn)中實(shí)際遇到的問題及排查總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能
大家好,本篇文章主要講的是利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12