成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端 分布式 Redis
Redisson 還支持可重入讀寫鎖,允許在分布式場景下,同時有多個讀鎖和一個寫鎖處于加鎖狀態。

[[409489]]

前言

Redisson 還支持可重入讀寫鎖,允許在分布式場景下,同時有多個讀鎖和一個寫鎖處于加鎖狀態。

1、使用讀寫鎖

Redisson 讀寫鎖實現了 JUC 下的 ReadWriteLock,使用方式基本相同。

2、源碼

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

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

讀鎖源碼

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

參數列表:

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

首次加讀鎖

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

讀鎖重入

如果是重入的情況下:

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

讀讀支持

  • 鎖存在,進入第二部分
  • 對當前線程的值自增 1,這里已經是第二個線程了
  • 設置第二個線程 {anyRWLock}:7c390320-78e3-497f-a3d8-ac34a44d0464:48:rwlock_timeout:1 的超時時間

寫讀互斥

已經加了讀鎖了,此時寫鎖進來,不滿足第一部分,也不滿足第二部分,所以直接返回當前鎖的剩余時間。

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

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

  • 鎖 anyRWLock 是哈希表結構的
  • 加鎖時,會對哈希表設置 mode 字段來表示這個鎖是讀鎖還是寫鎖,mode = read 表示讀鎖
  • 加鎖時,會對哈希表設置當前線程 anyRWLock 的 UUID:ThreadId 字段,值表示重入次數
  • 每次加鎖,會額外維護一個 key 表示這次鎖的超時時間,這個 key 的結構是 {鎖名字}:UUID:ThreadId:rwlock_timeout:重入次數

寫鎖源碼

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

參數列表:

  • KEYS[1]:當前鎖 anyRWLock
  • ARGV[1]:鎖時間,默認 30s
  • ARGV[2]:寫鎖名字,UUID:ThreadId:write 組成的字符串,c69a9ed4-5c30-4952-814e-c0b94ad03a7f:1:write

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

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

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

3、總結

到這里基本上讀寫鎖就看完了,讀鎖實現的稍微復雜一些,寫鎖簡單明了。

在讀鎖的時候:

  • 鎖 anyRWLock 是哈希表結構
  • 加鎖時,會對哈希表設置 mode 字段來表示這個鎖是讀鎖還是寫鎖,mode = read 表示讀鎖
  • 加鎖時,會對哈希表設置當前線程 anyRWLock 的 UUID:ThreadId 字段,值表示重入次數
  • 每次加鎖,會額外維護一個 key 表示這次鎖的超時時間,這個 key 的結構是 {鎖名字}:UUID:ThreadId:rwlock_timeout:重入次數

在寫鎖的時候:

  • 鎖 anyRWLock 是哈希表結構
  • 加鎖時,會對哈希表設置 mode 字段來表示這個鎖是讀鎖還是寫鎖,mode = write 表示寫鎖
  • 在 anyRWLock 中再額外維護一個字段 UUID:ThreadId:write 表示重入次數
至于看門狗,這些都和之前的一樣,就不額外介紹了。
本文轉載自微信公眾號「程序員小航」,可以通過以下二維碼關注。轉載本文請聯系程序員小航公眾號。

 

責任編輯:武曉燕 來源: 程序員小航
相關推薦

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2021-06-30 14:56:12

Redisson分布式公平鎖

2021-07-01 09:42:08

Redisson分布式

2021-07-16 07:57:34

ZooKeeperCurator源碼

2022-08-04 08:45:50

Redisson分布式鎖工具

2021-06-27 21:24:55

RedissonJava數據

2022-06-30 08:04:16

Redis分布式鎖Redisson

2021-07-03 17:45:57

分布式Redisson MultiLock

2021-07-07 07:09:49

Redisson分布式鎖源碼

2021-06-28 10:51:55

Redisson分布式鎖Watchdog

2024-01-02 13:15:00

分布式鎖RedissonRedis

2023-08-27 22:13:59

Redisson分布式緩存

2021-09-17 07:51:24

RedissonRedis分布式

2018-11-27 16:17:13

分布式Tomcat

2021-11-26 06:43:19

Java分布式

2021-07-08 09:21:17

ZooKeeper分布式鎖 Curator

2019-06-19 15:40:06

分布式鎖RedisJava

2023-09-04 08:12:16

分布式鎖Springboot

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2025-03-25 10:29:52

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲第一区国产精品 | 一区二区三区四区在线视频 | 人人看人人干 | 国产精品久久久久久亚洲调教 | 久久精品国产99国产 | 精品一二区 | 日韩美女在线看免费观看 | 91精品国产综合久久久亚洲 | 久久99一区二区 | 做a视频在线观看 | 自拍偷拍亚洲欧美 | 亚洲精品永久免费 | 欧美日韩一 | 91精品入口蜜桃 | 久久婷婷国产麻豆91 | 亚洲欧洲在线观看视频 | 一区二区精品在线 | 国产第二页 | 精品亚洲永久免费精品 | 亚洲精品视频一区 | 亚洲av一级毛片 | 国产精品久久久久一区二区三区 | 国产露脸国语对白在线 | www.国产一区 | 国产在线精品一区二区 | 国产精品久久久精品 | 亚洲精品国产成人 | 欧美一区二区三区在线观看视频 | 伊人影院在线观看 | 超碰成人免费 | 中文字幕a√ | 精品欧美色视频网站在线观看 | 天天操夜夜操免费视频 | 亚洲精品自拍视频 | a级黄色网 | a亚洲精品 | 亚洲天堂一区二区 | wwwxxx日本在线观看 | 综合另类 | a级在线| 精品国产视频 |