新聞中心
Redisson 分布式鎖源碼之公平鎖釋放
作者: 程序員小航 2021-07-02 08:51:09
開發(fā)
前端
分布式
Redis 看門狗機(jī)制是在 RedissonBaseLock#scheduleExpirationRenewal 方法中,這塊公平鎖和非公平鎖并無區(qū)別。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供察哈爾右翼中旗網(wǎng)站建設(shè)、察哈爾右翼中旗做網(wǎng)站、察哈爾右翼中旗網(wǎng)站設(shè)計(jì)、察哈爾右翼中旗網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、察哈爾右翼中旗企業(yè)網(wǎng)站模板建站服務(wù),十余年察哈爾右翼中旗做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
[[408803]]
前言
看門狗機(jī)制是在 RedissonBaseLock#scheduleExpirationRenewal 方法中,這塊公平鎖和非公平鎖并無區(qū)別。
前文已經(jīng)了解到,公平鎖加鎖失敗之后,會(huì)將當(dāng)前放到等待隊(duì)列中,通過 Java 代碼中的循環(huán)不斷嘗試獲得鎖。
1.鎖釋放
主動(dòng)釋放
源碼:RedissonFairLock#unlockInnerAsync
- KEYS[1]:加鎖的名字,anyLock;
- KEYS[2]:加鎖等待隊(duì)列,redisson_lock_queue:{anyLock};
- KEYS[3]:等待隊(duì)列中線程鎖時(shí)間的 set 集合,redisson_lock_timeout:{anyLock},是按照鎖的時(shí)間戳存放到集合中的;
- KEYS[4]:redisson_lock__channel:{anyLock};
- ARGV[1]:LockPubSub.UNLOCK_MESSAGE;
- ARGV[2]:鎖超時(shí)時(shí)間 30000;
- ARGV[3]:UUID:ThreadId 組合 58f6c4a2-9908-4957-b229-283a45359c4b:47;
- ARGV[4]:currentTime 當(dāng)前時(shí)間戳。
這塊邏輯突出部分已經(jīng)標(biāo)出,重點(diǎn)就是釋放鎖。
- 鎖在隊(duì)列中,超時(shí)了則直接從隊(duì)列中移除;
- 鎖減少重入次數(shù),減少后,如果重入次數(shù)大于 0,重置超時(shí)時(shí)間,如果不大于 0,則直接移除鎖。
這樣的話后續(xù)就其他線程從等待隊(duì)列中開始獲得鎖。
超時(shí)刪除
在加鎖和釋放鎖的 lua 腳本中,第一段永遠(yuǎn)是一個(gè) while true do xxx,作用就是用來移除隊(duì)列中超時(shí)的鎖。
而持鎖線程的釋放,則和非公平鎖沒有任何區(qū)別,當(dāng)鎖超時(shí)或者服務(wù)宕機(jī),鎖就會(huì)被自動(dòng)釋放。(這個(gè)是指 anyLock)。
2.總結(jié)
公平鎖的釋放同樣分為主動(dòng)釋放和超時(shí)釋放。
主動(dòng)釋放,即自己調(diào)用釋放鎖。
超時(shí)刪除,則分為兩種,一種是持鎖線程超時(shí)刪除,這種和非公平鎖沒有任何區(qū)別,因?yàn)檫@個(gè)鎖也是含有超時(shí)時(shí)間+看門狗續(xù)租的。另一種則是等待隊(duì)列中的超時(shí)刪除,是在每次獲取鎖之前,判斷第一個(gè)等待線程的時(shí)間戳是否超時(shí),從而移除鎖。
本文轉(zhuǎn)載自微信公眾號(hào)「程序員小航」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員小航公眾號(hào)。
名稱欄目:Redisson分布式鎖源碼之公平鎖釋放
路徑分享:http://m.fisionsoft.com.cn/article/codjdcd.html


咨詢
建站咨詢
