- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Redisson 分布式锁源码之公平锁加锁由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
默认的加锁逻辑是非公平的.
在加锁失败时,线程会进入 while 循环,一直尝试获得锁,这时候是多线程进行竞争。就是说谁抢到就是谁的.
Redisson 提供了公平锁机制,使用方式如下:
下面一起看下公平锁是如何实现的?
1公平锁 。
相信小伙伴们看过前面的文章,已经轻车熟路了,直接定位到源码方法:RedissonFairLock#tryLockInnerAsync.
好家伙,这一大块代码,我截图也截不完,咱们直接分析 lua 脚本.
PS:虽然咱不懂 lua,但是这一堆堆的 if else 咱们大概还是能看懂的.
因为 debug 发现 command == RedisCommands.EVAL_LONG,所以直接看下面一部分.
这么长,连呼好几声好家伙.
先来看看参数都有啥?
加锁队列和集合是含有大括号的字符串。{XXXX} 是指这个 key 仅使用 XXXX 用来计算 slot 的位置.
2Lua 脚本分析 。
上面的 lua 脚本是分为几块的,咱们分别从不同的角度看下上面代码的执行.
首次加锁(Thread1) 。
第一部分,因为是首次加锁,所以等待队列为空,直接 跳出循环。这一部分执行结束.
第二部分:
执行完这里就 return 了。所以后面几部分就暂时不看了.
相当于下面两个命令(整个 lua 脚本都是原子的!):
Thread2 加锁 。
当 Thread1 加锁完成之后,此时 Thread2 来加锁.
Thread2 可以是本实例其他线程,也可以是其他实例的线程.
第一部分,虽然锁被 Thread1 占用了,但是等待队列是空的,直接跳出循环.
第二部分,锁存在,直接跳过.
第三部分,线程是否持锁,没有持锁,直接跳过.
第四部分,线程是否在等待队列中,Thread2 才来加锁,不在里面,直接跳过.
Thread2 最后会来到这里:
zadd KEYS[3] timeout ARGV[2] 。
这里使用 zadd 命令分别放置的是,redisson_lock_timeout:{anyLock},超时时间戳(1624612689520),线程(UUID2:Thread2).
其中超时时间戳当分数,用来在有序集合中排序,表示加锁的顺序.
Thread3 加锁 。
Thread1 占有了锁,Thread2 在等待,此时线程 3 来了.
获取 firstThreadId2 此时队列是有线程的是 UUID2:Thread2.
判断 firstThreadId2 的分数(超时时间戳)是不是小于当前时间戳:
小于等于则说明超时了,移除 firstThreadId2,
大于,则会进入后续判断.
第2、3、四部分都不满足条件.
Thread3 最后也会来到这里:
3总结 。
本文主要总结了公平锁的加锁逻辑,这里涉及到比较多的 Redis 操作,做一下简要总结:
需要理解的就是这里会额外添加一个等待队列,以及有序集合.
原文链接:https://mp.weixin.qq.com/s/4EOWFNBIbGOKeW3r3YOKRQ 。
最后此篇关于Redisson 分布式锁源码之公平锁加锁的文章就讲到这里了,如果你想了解更多关于Redisson 分布式锁源码之公平锁加锁的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个应用程序倾向于在后台线程中执行很多数据库 Activity (下载大型数据库更新),而且这个过程经常使“UI线程”匮乏-我知道数据库是不定期发布的,但是所使用的@synchronized机制不
我正在创建一个程序,用户可以在从一组项目中选择的两个项目之间进行一系列投票。每次投票后,会显示集合中的两个新项目并对其进行投票,直到看到集合中的所有成员。 这是我的限制条件: 每个用户应该以不同的随机
我正在开发一个在线判断类型的系统,其中大约 100 个不受信任的可执行文件将同时运行并评估相同的输入数据。 我希望每个可执行文件都限制在预定义资源池的 CPU、内存、磁盘空间等的相等份额。例如,如果资
我正在从事一个关于 CFS 的项目。使用Ftrace跟踪Linux公平进程的全路径。 根据文档 https://lwn.net/Articles/370423/ . [tracing]# echo $
Semaphore 类概述 developer.android.com看起来不错 - 对于那些已经熟悉这些概念和术语的人来说。 我熟悉那里的一些首字母缩略词和其他行话(例如 FIFO、锁等),但其他的
我是一名优秀的程序员,十分优秀!