能自己做效果圖的網站百度推廣有效果嗎
MultiLock
MultiLock,英語直譯為多個鎖。
redisson分布式鎖中的MultiLock這個機制,可以將多個鎖合并為一個大鎖,對一個大鎖進行統(tǒng)一的申請加鎖以及釋放鎖
一次性鎖定多個資源,再去處理一些事情,然后事后一次性釋放所有的資源對應的鎖
RLock lock1 = redisson.getLock("anyLock1");RLock lock2 = redisson.getLock("anyLock2");RLock lock3 = redisson.getLock("anyLock3");RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2, lock3);multiLock.lock();multiLock.unlock();
在項目里使用的時候,很多時候一次性要鎖定多個資源,比如說鎖掉一個庫存,鎖掉一個訂單,鎖掉一個積分,一次性鎖掉多個資源,多個資源都不讓別人隨意修改,然后你再一次性更新多個資源,釋放多個鎖
MultiLock的源碼,我們初步看一下,其實也不過是沒什么特別的,就是包裹了多個RedissonLock,底層就是嘗試依次對每一個鎖都要成功加鎖,如果所有的鎖都成功加鎖了之后,那么就認為MultiLock就成功加鎖了
釋放鎖
依次去釋放每一把鎖就可以
釋放鎖的代碼一目了然,就是循環(huán)釋放每一把鎖。
加鎖
再看一下的源碼
這里的locks就是RedissonMultiLock中我們傳的幾個鎖,鎖的個數*3,基礎等待時間baseWaitTime是4500毫秒。
if和else判斷中都是算等待時間的邏輯。
而最下面的while死循環(huán),就是要加鎖的邏輯,就是不停地加鎖,失敗了繼續(xù)加鎖。只要沒有全部獲取到就一直循環(huán)。
RedissonMultiLock.tryLock()方法中
截止到226行,這幾個時間分別是
watTime = 4500毫秒
time = 當前時間
remainTime = 4500毫秒
lockWaitTime = 4500毫秒
failedLocksLimit = 0
awaitTime = 4500毫秒
繼續(xù)走,到for循環(huán)里面,取出來locks中的一個鎖開始處理
調用了lock.tryLock()方法
這是獲取鎖的關鍵代碼
lockAcquired = lock.tryLock(awaitTime, newLeaseTime, TimeUnit.MILLISECONDS);
lock是底層的RedissonLock,他沒有使用lock.lock(),用的是tryLock(),指定了獲取鎖等待超時的時間,4500毫秒,必須獲取到這個鎖,如果獲取不到這個鎖,就退出,標記為獲取鎖失敗
哪怕是獲取到鎖之后,這個鎖在多長時間內會自動釋放,newLeaseTime是-1,因為你的newLeaseTime是-1,所以說如果獲取到了鎖,會啟動一個lock watchdog不斷的刷新你的鎖key的生存時間為30000毫秒
繼續(xù)往下,現在情況是拿到鎖之后,不會再走藍色選中的代碼了。
最后走到if (remainTime != -1)代碼中去,這里的邏輯是怎么回事呢
remainTime = 4500毫秒
經過了一個lock的獲取,可能消耗掉了比如說20毫秒,100毫秒,500毫秒,耗費了500毫秒
remainTime = 4500毫秒 - 500毫秒 = 4000毫秒
time = 當前時間
如果remainTime <= 0,意味著什么呢?獲取鎖的時間已經超過了4500毫秒了,迄今為止,你獲取到這些所的時間,已經超過了預設的4500毫秒了,相當于是你獲取多個鎖的時間,最多不能超過4500毫秒
如果一旦獲取各個鎖的時間超過了4500毫秒,此時就會釋放掉所有已經獲取的鎖,然后返回一個false,再次進入while true中的一個死循環(huán),嘗試走上述一模一樣的流程
獲取了三把鎖,耗時了1000毫秒,此時remainTime還剩下3500毫秒,4477,4500,23毫秒獲取了三把鎖
釋放鎖的話,就是依次調用所有的鎖的釋放的邏輯,lua腳本,同步等待所有的鎖釋放完畢,才會返回
而加鎖的話,默認的行為之下,你包裹了幾把鎖,就會鎖數量 * 1500毫秒,獲取所有的鎖必須在多長時間之內就要結束,如果超時就會重新再次死循環(huán)嘗試獲取鎖。使用的是各個鎖的tryLock()方法,指定了說在獲取每個單獨的鎖的時候,會有一個獲取超時退出的時間