本篇主要講解redisson中得redlock實現,但是很多知識因為和前面一樣,就直接省略了
redlock 原理理一下:
(1)獲取當前時間戳,單位是毫秒
(2)和redissonmultilock一樣,一次輪詢嘗試去每個機器上建立鎖,需要加乙個超時時間,如果超過一定時間就表示獲取鎖失敗
(3)嘗試在大多數節點上建立乙個鎖,如果3個節點就要求建立 n/2 + 1 = 2個節點上建立鎖
(4)客戶端計算建立鎖的時間,如果在規定時間內,建立鎖成功,就代表加鎖成功
(5)如果建立鎖失敗,那麼就會依次的刪除鎖
(6)只要別人建立了鎖,那麼你就得不停得輪詢去嘗試獲取鎖
public static void main(string args) throws exception
但是這個redlock的原始碼相當的簡單,為什麼?我們學習了redissonmultilock的原始碼,其實你們想想redlock的邏輯,其實是不是和redissonmultilock極其的相似,
對的,沒錯,redlock 就是redissonmultilock 的乙個子類,裡面僅僅覆蓋了幾個方法
public class redissonredlock extends redissonmultilock objects.
* each rlock object could be created by own redisson instance.
** @param locks - array of locks
*/public redissonredlock(rlock... locks)
//允許失敗的個數
@override
protected int failedlockslimit()
//最少要獲取幾個鎖
//如果size = 3,計算出來=2
protected int minlocksamount(final listlocks)
//計算等待時間,其實是計算出乙個獲取鎖的超時時間
@override
protected long calclockwaittime(long remaintime)
@override
public void unlock()
}
public boolean trylock(long waittime, long leasetime, timeunit unit) throws interruptedexception catch (executionexception e)
long newleasetime = -1;
if (leasetime != -1)
long time = system.currenttimemillis();
long remaintime = -1;
if (waittime != -1)
//lockwittime = 1500ms
long lockwaittime = calclockwaittime(remaintime);
//以前multilock 是預設0,但是對於redlock n- (n/2+1) 假設n=3.計算出來就是1
int failedlockslimit = failedlockslimit();
listacquiredlocks = new arraylist(locks.size());
for (listiteratoriterator = locks.listiterator(); iterator.hasnext();) else
} catch (exception e)
if (lockacquired) else
if (failedlockslimit == 0)
failedlockslimit = failedlockslimit();
acquiredlocks.clear();
// reset iterator
//復位迭代器
while (iterator.hasprevious())
} else
}if (remaintime != -1) }}
if (leasetime != -1)
for (rfuturerfuture : futures)
}return true;
}
那麼釋放鎖呢,其實也就是依次得去呼叫底層redissonlock得釋放鎖得api而已 Redisson 原始碼初探(四)釋放鎖
override public void unlock catch redi ception e else override public rfutureunlockasync final long threadid boolean opstatus future.getnow if opstatu...
OkHttp原始碼初探
在之前的文章我中我們介紹了okhttp的基本使用方法並簡單說明了原始碼下各個module的功能作用,從這篇開始我們將要開始分析okhttp的原始碼。首先,我們先來回憶一下okhttp的使用過程 1.建立乙個okhttpclient物件 2.建立乙個request物件 3.呼叫okhttpclient...
RequireJS原始碼初探
前兩天跟著葉小釵的部落格,看了下requirejs的原始碼,大體了解了其中的執行過程。不過在何時進行依賴項的載入,以及具體的 在何處執行,還沒有搞透徹,奈何能力不夠,只能先記錄一下了。看原始碼從頭開始看,肯定是不切實際的。按照葉小釵的方法,是從data main開始的,所以我們也從那裡開始把!首先,...