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 分布式鎖源碼 10:讀寫鎖

        共 2311字,需瀏覽 5分鐘

         ·

        2021-07-07 13:18

        前言

        Redisson 還支持可重入讀寫鎖,允許在分布式場景下,同時(shí)有多個(gè)讀鎖和一個(gè)寫鎖處于加鎖狀態(tài)。

        1

        使用讀寫鎖

        Redisson 讀寫鎖實(shí)現(xiàn)了 JUC 下的 ReadWriteLock,使用方式基本相同。

        2

        源碼

        加鎖源碼基本和之前的可重入鎖加鎖無區(qū)別,唯一的差異就是在 Lua 腳本這里。

        所以下面著重分析 Lua 腳本。

        讀鎖源碼

        源碼地址:org.redisson.RedissonReadLock#tryLockInnerAsync

        參數(shù)列表:

        1. KEYS[1]:鎖名字 anyRWLock
        2. KEYS[2]:鎖超時(shí) key {鎖名字}:UUID:ThreadId:rwlock_timeout 組成的字符串,{anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout
        3. ARGV[1]:鎖時(shí)間,默認(rèn) 30s
        4. ARGV[2]:當(dāng)前線程,UUID:ThreadId 組成的字符串,e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1
        5. ARGV[3]:寫鎖名字,getWriteLockName(threadId) 寫鎖名字,UUID:ThreadId:write 組成的字符串, e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:write
        首次加讀鎖
        1. 鎖不存在,直接走第一部分
        2. 設(shè)置鎖 anyRWLock 的 mode 是 read,表示這是個(gè)讀鎖
        3. 設(shè)置鎖 anyRWLock 的 e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1(當(dāng)前線程)值為 1
        4. 設(shè)置鎖 {anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout:1 的值是 1,表示當(dāng)前線程,當(dāng)前重入的超時(shí)時(shí)間
        5. 設(shè)置兩個(gè) RedisKey 的過期時(shí)間
        讀鎖重入

        如果是重入的情況下:

        1. 鎖存在,且是讀鎖,直接進(jìn)入第二部分
        2. 對鎖 anyRWLock 的 e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1(當(dāng)前線程)值自增 1 表是重入
        3. 再創(chuàng)建 {anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout:2 表示第二次加鎖的超時(shí)時(shí)間
        讀讀支持
        1. 鎖存在,進(jìn)入第二部分
        2. 對當(dāng)前線程的值自增 1,這里已經(jīng)是第二個(gè)線程了
        3. 設(shè)置第二個(gè)線程 {anyRWLock}:7c390320-78e3-497f-a3d8-ac34a44d0464:48:rwlock_timeout:1 的超時(shí)時(shí)間
        寫讀互斥

        已經(jīng)加了讀鎖了,此時(shí)寫鎖進(jìn)來,不滿足第一部分,也不滿足第二部分,所以直接返回當(dāng)前鎖的剩余時(shí)間。

        然后再 Java 代碼中進(jìn)行 while (true) 自旋等待。

        通過上面可以看出,在讀鎖的時(shí)候:

        1. 鎖 anyRWLock 是哈希表結(jié)構(gòu)的
        2. 加鎖時(shí),會對哈希表設(shè)置 mode 字段來表示這個(gè)鎖是讀鎖還是寫鎖,mode = read 表示讀鎖
        3. 加鎖時(shí),會對哈希表設(shè)置當(dāng)前線程 anyRWLock 的 UUID:ThreadId 字段,值表示重入次數(shù)
        4. 每次加鎖,會額外維護(hù)一個(gè) key 表示這次鎖的超時(shí)時(shí)間,這個(gè) key 的結(jié)構(gòu)是 {鎖名字}:UUID:ThreadId:rwlock_timeout:重入次數(shù)

        寫鎖源碼

        源碼地址:org.redisson.RedissonWriteLock#tryLockInnerAsync

        參數(shù)列表:

        1. KEYS[1]:當(dāng)前鎖 anyRWLock
        2. ARGV[1]:鎖時(shí)間,默認(rèn) 30s
        3. ARGV[2]:寫鎖名字,UUID:ThreadId:write 組成的字符串,c69a9ed4-5c30-4952-814e-c0b94ad03a7f:1:write

        寫鎖源碼相對比較好理解:

        1. 判斷鎖的模式,是寫鎖
        2. 鎖不存在直接創(chuàng)建
        3. 鎖存在,再判斷是不是自己,是自己則重入

        這么下來,可以看出直接滿足,寫寫互斥,讀寫互斥,當(dāng)前線程又可以重入。

        3

        總結(jié)

        到這里基本上讀寫鎖就看完了,讀鎖實(shí)現(xiàn)的稍微復(fù)雜一些,寫鎖簡單明了。

        在讀鎖的時(shí)候:

        1. 鎖 anyRWLock 是哈希表結(jié)構(gòu)
        2. 加鎖時(shí),會對哈希表設(shè)置 mode 字段來表示這個(gè)鎖是讀鎖還是寫鎖,mode = read 表示讀鎖
        3. 加鎖時(shí),會對哈希表設(shè)置當(dāng)前線程 anyRWLock 的 UUID:ThreadId 字段,值表示重入次數(shù)
        4. 每次加鎖,會額外維護(hù)一個(gè) key 表示這次鎖的超時(shí)時(shí)間,這個(gè) key 的結(jié)構(gòu)是 {鎖名字}:UUID:ThreadId:rwlock_timeout:重入次數(shù)

        在寫鎖的時(shí)候:

        1. 鎖 anyRWLock 是哈希表結(jié)構(gòu)
        2. 加鎖時(shí),會對哈希表設(shè)置 mode 字段來表示這個(gè)鎖是讀鎖還是寫鎖,mode = write 表示寫鎖
        3. 在 anyRWLock 中再額外維護(hù)一個(gè)字段 UUID:ThreadId:write 表示重入次數(shù)

        至于看門狗,這些都和之前的一樣,就不額外介紹了。


        - <End /> -




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



        瀏覽 68
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(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>
            黄污视频免费看 | 操浪逼 | 99视频在线精品 | 日批视频 | 操逼视频国产精品 | 亚洲AV午夜精品无码专区在线 | 99re6这里有精品热视频 | 国产一线二线三线网站 | hitomi大乳boobs | 亚色91|