<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 分布式鎖源碼 03:可重入鎖互斥

          共 703字,需瀏覽 2分鐘

           ·

          2021-07-01 22:48

          前言

          看過可重入鎖的 Lua 腳本,已經(jīng)可以知道當(dāng)鎖存在時,是會加鎖失敗的。

          下面看一下,加鎖失敗之后是如何處理的呢?

          1

          加鎖 Lua 腳本

          在 lua 腳本中,前兩段 if 分別排除了兩種情況:

          1. 鎖不存在;
          2. 鎖存在且是自己線程(可重入);

          剩下的情況就是鎖存在,但是不是自己,也就意味著加鎖失敗。

          執(zhí)行 pttl 命令,返回鎖的剩余時間。

          2

          加鎖失敗后的處理

          源碼定位:org.redisson.RedissonLock#lock(long, java.util.concurrent.TimeUnit, boolean)

          先來看開頭一部分:

          加鎖成功后,會返回 ttl,此處會判斷為 null,直接返回。

          所以,下面的部分就是當(dāng)獲取鎖失敗之后的邏輯。

          忽略掉不需要很關(guān)注的邏輯,重點則是 while (true) 里面這一小塊。

          一直循環(huán)調(diào)用 tryAcquire 方法,直到加鎖成功!

          3

          總結(jié)

          1. 可重入鎖的互斥是依靠 Redis Lua 腳本來保證的;
          2. 加鎖失敗會返回當(dāng)前鎖的剩余時間;
          3. 加鎖失敗后,會在 Java 代碼中使用 while 循環(huán)一直嘗試加鎖。

          大概的流程,如下圖:


          - <End /> -




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




          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  在线黄色网 | 青娱乐av免费观看 | 精品久久人人爽天天玩人人妻 | 欧美日韩第一区 | 黄色一级片免费看 |