Redisson 分布式鎖源碼 03:可重入鎖互斥

前言
看過可重入鎖的 Lua 腳本,已經(jīng)可以知道當(dāng)鎖存在時,是會加鎖失敗的。
下面看一下,加鎖失敗之后是如何處理的呢?
1
加鎖 Lua 腳本

在 lua 腳本中,前兩段 if 分別排除了兩種情況:
鎖不存在; 鎖存在且是自己線程(可重入);
剩下的情況就是鎖存在,但是不是自己,也就意味著加鎖失敗。
執(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é)
可重入鎖的互斥是依靠 Redis Lua 腳本來保證的; 加鎖失敗會返回當(dāng)前鎖的剩余時間; 加鎖失敗后,會在 Java 代碼中使用 while 循環(huán)一直嘗試加鎖。
大概的流程,如下圖:

- <End /> -
歷史文章 | 相關(guān)推薦

評論
圖片
表情
