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

Redisson 分布式鎖源碼之公平鎖排隊加鎖

開發(fā) 前端 分布式 Redis
Redis sorted set 有序集合數(shù)據(jù)結構:存放等待線程的順序,分數(shù) score 用來是等待線程的超時時間戳。

[[408587]]

前言

在上一篇文章中已經(jīng)分析過公平鎖的加鎖源碼,并得出結論:

Redis Hash 數(shù)據(jù)結構:存放當前鎖,Redis Key 就是鎖,Hash 的 field 是加鎖線程,Hash 的 value 是 重入次數(shù);

Redis List 數(shù)據(jù)結構:充當線程等待隊列,新的等待線程會使用 rpush 命令放在隊列右邊;

Redis sorted set 有序集合數(shù)據(jù)結構:存放等待線程的順序,分數(shù) score 用來是等待線程的超時時間戳。

現(xiàn)在看一下加鎖失敗被放到等待隊列之后,線程是如何處理的?

1排隊等鎖

源碼入口:org.redisson.RedissonLock#lock(long, java.util.concurrent.TimeUnit, boolean)。

線程進入排隊之后,在 Java 代碼中會 while (true) 一直循環(huán)調用 tryAcquire,嘗試獲取鎖。

最終還是來到 RedissonFairLock#tryLockInnerAsync 方法中。

方便起見,重新貼一下 Lua 腳本,以及腳本的參數(shù)含義。

  1. KEYS[1]:加鎖的名字,anyLock;
  2. KEYS[2]:加鎖等待隊列,redisson_lock_queue:{anyLock};
  3. KEYS[3]:等待隊列中線程鎖時間的 set 集合,redisson_lock_timeout:{anyLock},是按照鎖的時間戳存放到集合中的;
  4. ARGV[1]:鎖超時時間 30000
  5. ARGV[2]:UUID:ThreadId 組合 a3da2c83-b084-425c-a70f-5d9a08b37f31:1
  6. ARGV[3]:threadWaitTime 默認 300000
  7. ARGV[4]:currentTime 當前時間戳

源碼分析

第一部分,while 循環(huán):

  1. 從等待隊列 redisson_lock_queue:{anyLock} 中獲取第一個等待線程;
  2. 從等待線程超時集合 redisson_lock_timeout:{anyLock} 中獲取第一個等待線程的分數(shù);
  3. 沒有超時,直接結束,超時了,則直接移除。

第二部分,當前鎖存在,直接跳過。

第三部分,當前鎖不是持鎖線程,直接跳過。

第四部分,

直接返回當前鎖還有多久到期。

當前 Redisson 版本為 3.15.6,不同版本的略有不同。

隊列重排

這里不存在重新排序,因為官方認為這是一個 bug,重新進行了修復。

具體可以閱讀:Justin Corpron 2019/5/10, 04:13 Fix timeout drift in RedissonFairLock

最大的變化就是增加了第四部分。

圖僅僅代表兩個版本的差別,并不是代表這個版本才修改。

2總結

當線程獲取鎖失敗,進入到等待隊列時,ttl != null,在 Java 代碼中會不斷嘗試獲取鎖。

當鎖不存在且當前線程是在等待隊列頭時,直接獲得鎖。這個排隊的過程就是公平鎖的提現(xiàn)。

本文轉載自微信公眾號「程序員小航」,可以通過以下二維碼關注。轉載本文請聯(lián)系程序員小航公眾號。

 

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

2021-06-30 14:56:12

Redisson分布式公平鎖

2021-07-02 08:51:09

Redisson分布式鎖公平鎖

2021-07-03 17:45:57

分布式Redisson MultiLock

2021-06-27 21:24:55

RedissonJava數(shù)據(jù)

2021-07-06 08:37:29

Redisson分布式

2022-08-04 08:45:50

Redisson分布式鎖工具

2022-06-30 08:04:16

Redis分布式鎖Redisson

2021-07-07 07:09:49

Redisson分布式鎖源碼

2021-07-10 10:02:30

ZooKeeperCurator并發(fā)

2024-01-02 13:15:00

分布式鎖RedissonRedis

2021-06-28 10:51:55

Redisson分布式鎖Watchdog

2021-07-09 06:48:31

ZooKeeperCurator源碼

2021-07-16 07:57:34

ZooKeeperCurator源碼

2023-08-27 22:13:59

Redisson分布式緩存

2018-07-17 08:14:22

分布式分布式鎖方位

2022-04-14 07:56:30

公平鎖Java線程

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
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线免费观看毛片 | 中国av在线免费观看 | 欧美成年人视频在线观看 | 午夜免费观看体验区 | 国产精品视频一二三 | 国产精品视频 | 国产成人久久精品一区二区三区 | 精品在线一区二区 | 欧美一区二区三区免费电影 | 天天想天天干 | 成人在线不卡 | 中文字幕一区在线观看视频 | 中文字幕高清av | 视频精品一区二区三区 | 成人网址在线观看 | 国产精品免费一区二区三区四区 | 欧美国产一区二区 | 日韩一区二区在线看 | 久久综合成人精品亚洲另类欧美 | 中文字幕高清在线 | 婷婷精品 | 青春草国产 | 免费人成在线观看网站 | 亚洲欧美一区二区三区国产精品 | 国产91丝袜在线播放 | 一本一道久久a久久精品蜜桃 | 一级做a爰片性色毛片16 | 精品国产欧美一区二区三区成人 | 人人干人人玩 | 国产免费国产 | 黑人精品欧美一区二区蜜桃 | av一区二区三区在线观看 | 伊人精品 | 全免费a级毛片免费看视频免 | 国产视频一区二区 | 中文字幕国产精品视频 | 精品一区在线免费观看 | 国产伊人久久久 | 久久99深爱久久99精品 | 国产自产c区 | 视频1区 |