日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Redisson 分布式鎖源碼 10:讀寫鎖

Redisson 分布式鎖源碼 10:讀寫鎖

作者:程序員小航 2021-07-06 08:37:29

開發(fā)

前端

分布式

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

成都創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)臺(tái)山,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

前言

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

1、使用讀寫鎖

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

2、源碼

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

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

讀鎖源碼

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

參數(shù)列表:

  • KEYS[1]:鎖名字 anyRWLock
  • KEYS[2]:鎖超時(shí) key {鎖名字}:UUID:ThreadId:rwlock_timeout 組成的字符串,{anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout
  • ARGV[1]:鎖時(shí)間,默認(rèn) 30s
  • ARGV[2]:當(dāng)前線程,UUID:ThreadId 組成的字符串,e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1
  • ARGV[3]:寫鎖名字,getWriteLockName(threadId) 寫鎖名字,UUID:ThreadId:write 組成的字符串, e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:write

首次加讀鎖

  • 鎖不存在,直接走第一部分
  • 設(shè)置鎖 anyRWLock 的 mode 是 read,表示這是個(gè)讀鎖
  • 設(shè)置鎖 anyRWLock 的 e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1(當(dāng)前線程)值為 1
  • 設(shè)置鎖 {anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout:1 的值是 1,表示當(dāng)前線程,當(dāng)前重入的超時(shí)時(shí)間
  • 設(shè)置兩個(gè) RedisKey 的過期時(shí)間

讀鎖重入

如果是重入的情況下:

  • 鎖存在,且是讀鎖,直接進(jìn)入第二部分
  • 對(duì)鎖 anyRWLock 的 e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1(當(dāng)前線程)值自增 1 表是重入
  • 再創(chuàng)建 {anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeout:2 表示第二次加鎖的超時(shí)時(shí)間

讀讀支持

  • 鎖存在,進(jìn)入第二部分
  • 對(duì)當(dāng)前線程的值自增 1,這里已經(jīng)是第二個(gè)線程了
  • 設(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í)候:

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

寫鎖源碼

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

參數(shù)列表:

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

寫鎖源碼相對(duì)比較好理解:

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

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

3、總結(jié)

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

在讀鎖的時(shí)候:

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

在寫鎖的時(shí)候:

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

至于看門狗,這些都和之前的一樣,就不額外介紹了。
本文轉(zhuǎn)載自微信公眾號(hào)「程序員小航」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員小航公眾號(hào)。


分享題目:Redisson 分布式鎖源碼 10:讀寫鎖
轉(zhuǎn)載源于:http://m.5511xx.com/article/cdjodjs.html