1、業務單機情況下
? ? ? ? 問題:并發沒有加鎖導致線程安全問題。
? ? ? ? 解決方法:加鎖處理,如lock、synchronized
? ? ? ? 仍有問題:業務分布式情況下,代碼級別加鎖已經無效。需要借助第三方組件,如redis、zookeeper。
2、業務分布式情況下,使用redis的setNX,實現加鎖解鎖,保證業務前加鎖,業務后解鎖。
? ? ? ? 問題:1、業務異常導致解鎖失敗? 2、機器異常導致解鎖失敗
? ? ? ? 解決方案:對于1、try/finally finally中解鎖? 2、加鎖時key添加超時時間
? ? ? ? 引入新的問題:1、需要保證加鎖和超時操作的原子性 2、業務運行超過超時時間,導致解鎖了其他線程的鎖 3、超時時間
3、分布式鎖實現過程中遇到的問題
? ? ? ? 問題:1、需要保證加鎖和超時操作的原子性 2、業務運行超過超時時間,導致解鎖了其他線程的鎖
? ? ? ? 解決方案:對于1、加鎖命令同時設置超時? 2、加鎖前生成唯一uuid,鎖value用該uuid,解鎖時判斷uuid是否相等。
? ? ? ? 仍有問題:1、比對uuid和解鎖的過程不是原子的? 2、業務運行未結束,鎖提前釋放
4、分布式鎖實現過程中遇到的問題、
? ? ? ? 問題:1、比對uuid和解鎖的過程不是原子的? 2、業務運行未結束,鎖提前釋放
? ? ? ? 解決方案:對于1、使用lua腳本 2、看門狗機制,實現鎖續期
5、自己實現不如使用分布式鎖實現方案Redisson