Redisson分布式鎖解鎖異常問(wèn)題
問(wèn)題現(xiàn)象
程序中的redission執(zhí)行unlock()報(bào)錯(cuò)如下:
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id:
從報(bào)錯(cuò)信息可知:嘗試解鎖,而不是由當(dāng)前線程按節(jié)點(diǎn) ID 鎖定
問(wèn)題復(fù)現(xiàn)
//獲取鎖對(duì)象 RLock lock = redissonClient.getLock(key); try{ //獲取鎖 boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS); if (!tryLock) { //拋出業(yè)務(wù)異常 } }catch(){ //捕獲異常 }finally{ //解鎖 lock.unlock(); }
排查過(guò)程
如上代碼,線程無(wú)論是否有獲取鎖,都是需要去執(zhí)行解鎖方法,當(dāng)線程沒(méi)有獲得鎖,執(zhí)行unlock()就會(huì)報(bào)
java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id:錯(cuò)誤
解決方案
1、在解鎖時(shí)增加判斷
//判斷要解鎖的key是否已被鎖定;判斷要解鎖的key是否被當(dāng)前線程持有 if (lock.isLocked() && lock.isHeldByCurrentThread()) { lock.unlock(); }
2、優(yōu)化代碼
在執(zhí)行unlock()確保線程已經(jīng)獲得鎖
//獲取鎖對(duì)象 RLock lock = redissonClient.getLock(key); boolean tryLock; try { tryLock = lock.tryLock(5, TimeUnit.SECONDS); } catch (InterruptedException e) { throw new Exception("獲取分布式鎖失敗,請(qǐng)稍后再試"); } if (!tryLock) { throw new Exception("請(qǐng)稍后再試"); } try{ //拋出業(yè)務(wù)異常 }catch(){ //捕獲異常 }finally{ //解鎖 lock.unlock(); }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Redis分布式鎖的幾種實(shí)現(xiàn)方法
- 使用Redis實(shí)現(xiàn)分布式鎖的代碼演示
- Redis使用SETNX命令實(shí)現(xiàn)分布式鎖
- Redis分布式鎖使用及說(shuō)明
- redis分布式鎖實(shí)現(xiàn)示例
- Redis 實(shí)現(xiàn)分布式鎖時(shí)需要考慮的問(wè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)高效讀寫(xiě)鎖的代碼實(shí)例
這篇文章給大家介紹了如何利用Redis?lua實(shí)現(xiàn)高效的讀寫(xiě)鎖,讀寫(xiě)鎖的好處就是能幫助客戶(hù)讀到的數(shù)據(jù)一定是最新的,寫(xiě)鎖是排他鎖,而讀鎖是一個(gè)共享鎖,需要的朋友可以參考下2024-01-01redis不能訪問(wèn)本機(jī)真實(shí)ip地址的解決方案
這篇文章主要介紹了redis不能訪問(wèn)本機(jī)真實(shí)ip地址的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07redis計(jì)數(shù)器與數(shù)量控制的實(shí)現(xiàn)
使用Redis計(jì)數(shù)器可以輕松地解決數(shù)量控制的問(wèn)題,同時(shí)還能有效地提高應(yīng)用的性能,本文主要介紹了redis計(jì)數(shù)器與數(shù)量控制的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12redis性能優(yōu)化之生產(chǎn)中實(shí)際遇到的問(wèn)題及排查總結(jié)
這篇文章主要介紹了redis性能優(yōu)化之生產(chǎn)中實(shí)際遇到的問(wèn)題及排查總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能
大家好,本篇文章主要講的是利用Redis實(shí)現(xiàn)防止接口重復(fù)提交功能,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12