<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redisson 分布式鎖源碼 08:MultiLock 加鎖與鎖釋放

          共 1441字,需瀏覽 3分鐘

           ·

          2021-07-07 13:18

          前言

          基于 Redis 的 Redisson 分布式聯(lián)鎖 RedissonMultiLock 對象可以將多個 RLock 對象關(guān)聯(lián)為一個聯(lián)鎖,每個 RLock 對象實例可以來自于不同的 Redisson 實例。

          當(dāng)然,這是官網(wǎng)的介紹,具體是什么?一起看看聯(lián)鎖 MultiLock 使用以及源碼吧!

          1

          MultiLock 使用

          按照官方文檔的說法,這里 Redisson 客戶端可以不是同一個。當(dāng)然,一般工作中也不會說不用一個客戶端吧。

          2

          加鎖

          在閱讀 MultiLock 加鎖之前,小伙伴應(yīng)該已經(jīng)閱讀過普通加鎖的相關(guān)文章。

          源碼入口:org.redisson.RedissonMultiLock#lock()

          默認(rèn)超時時間 leaseTime 沒有設(shè)置,所以為 -1。

          這塊方法太長,咱們拆分進(jìn)行閱讀。

          1. 基礎(chǔ)等待時間 baseWaitTime = 鎖數(shù)量 * 1500,在這里就是 4500 毫秒;
          2. leaseTime == -1 所以 waitTime = baseWaitTime,也就是 4500;
          3. while (true) 調(diào)用 tryLock 加鎖,直到成功。

          調(diào)用 tryLock 方法,其中參數(shù) waitTime = 4500,leaseTime = -1,unit = MILLISECONDS。

          下面看一下 tryLock 里面有什么邏輯?

          leaseTime != -1 不滿足,這部分直接跳過。

          waitTime != -1 條件滿足,remainTime = 4500,lockWaitTime = 4500。

          所以,failedLocksLimit() 這個方法直接返回 0,就是必須全部加鎖成功。

          這里才是重點:

          遍歷所有的鎖,依次加鎖。

          加鎖邏輯就和可重入鎖加鎖并無區(qū)別了。所以 Lua 腳本就不進(jìn)行分析了。

          上面就是 tryLock 加鎖之后的結(jié)果。

          加鎖成功,則將成功的鎖放進(jìn) acquiredLocks 集合中;

          加鎖失敗,需要判斷 failedLocksLimit,因為這里是 0,所以會直接對成功加鎖集合 acquiredLocks 中的所有鎖執(zhí)行鎖釋放,同時清空成功集合,恢復(fù)迭代器。

          每次加鎖之后,會更新鎖剩余時間 remainTime,如果 remainTime 小于等于 0 了,則說明加鎖超時,直接返回 false。

          這樣就會執(zhí)行外部的 while (true) 邏輯,然后重新再走一遍 RedissonMultiLock#tryLock

          3

          鎖釋放

          看完加鎖邏輯,鎖釋放就更容易理解了。

          直接遍歷釋放鎖即可,lock.unlockAsync() 是調(diào)用的 RedissonBaseLock#unlockAsync() 方法。

          4

          總結(jié)

          根據(jù)我的理解,畫圖如下:

          總體而言,就是將 key1、key2、key3 …… keyN 放到一個 List 集合中,然后迭代循環(huán)加鎖,直到所有的都成功。解鎖的時候就是再遍歷鎖進(jìn)行釋放鎖。


          - <End /> -




          歷史文章 | 相關(guān)推薦




          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色综合小说 | 欧美性A√ | 亚洲怡红院av | 中文字幕亚洲视频在线观看 | 成人免费AA片 |