1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 1441字,需瀏覽 3分鐘

         ·

        2021-07-07 13:18

        前言

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

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

        1

        MultiLock 使用

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

        2

        加鎖

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

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

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

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

        1. 基礎(chǔ)等待時(shí)間 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() 這個(gè)方法直接返回 0,就是必須全部加鎖成功。

        這里才是重點(diǎn):

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

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

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

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

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

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

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

        3

        鎖釋放

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

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

        4

        總結(jié)

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

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


        - <End /> -




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




        瀏覽 63
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            另类毛片 | 日韩福利电影 | 久久久天堂 | 八戒电影高清免费完整版 | 香蕉成人在线视频 | 四川一级婬片A片AAA毛片软件 | 日韩中文字幕免费 | 操逼免费视频网站 | 日逼视频网站 | 草草久久久 |