Redisson 源码解析 --读写锁
2021-04-12 13:39:56 0 举报
Redisson 源码解析 --读写锁
作者其他创作
大纲/内容
mode=write
删除那个线程对应的timeout值 {test}:UUID:1:rwlock_timeout:1
return 0
-1 后为0,说明当前线程不存在重入
返回
N
test :{ \"mode\":\"write\
释放锁
看门狗:看test中是否有当前线程的key ,如果有就重置test的有效期 30 s
Y
mode = null
注意:就是这里如果是写锁,能再加读锁1、hincrby 设置当前线程的kay的值,进行 ++ (如果当前线程是读锁:则当前的值就进行 +1 )(如果当前线程是写锁:则当前的值就设置 1 )2、set 设置 {test}:UUID:1:rwlock_timeout:2 13、设置 {test}:UUID:1:rwlock_timeout:2 过期时间 30s4、设置 test 过期时间 30s
说明 -1 后 == 0 ,然后 删除test中的这个线程key UUID:1:writedel test UUID:1:write
删除 test 中的当前线程的key UUID_01:threadId_01
1、del删除test2、publish 发布消息:redisson_rwlock:{test}
对 test 中当前线程的value -1UUID_01:threadId_01
test 中不存在当前线程key UUID:1:write
表示:test是写锁,且 不是当前线程所持有的锁
return 1
看门狗
counter = 对test中当前线程的value值,进行-1
获取 test 中的mode值
如果test中不存在mode值,说明锁已经释放,发布消息释放锁publish 发布消息:redisson_rwlock:{test}
mode = write
读锁 前面逻辑和常规密码一样,主要分析lua脚本
maxRemainTime> 0
hset hash结构中插入数据,set string类型数据1、hset 设置test值 {\"mode\":\"read\"}2、hset 设置test的 {\"UUID:1\":1}3、set 设置一个string类型值,{test}:UUID:1:rwlock_timeout:1 1 (用来记录test锁最大的占有时间)4、设置 {test}:UUID:1:rwlock_timeout:1 过期时间 30s5、设置 test 过期时间 30s
mode = null未加任何锁
test 中的剩余key是否 > 1
锁不为null。而且不是写锁,说明这时候锁是读锁所以:读锁加上后,不管是不是同一个线程,都不能加写锁,但是同一个线程,可以先加写锁,再加读锁
return nil
test :{ \"mode\":\"read\
判断test是否存在当前线程写锁
mode值
当前test中的key是否 = 1
mode = read 或者( mode = write && test 中有当前线程的key )其实这个判断的意思是:当前Test是读锁,或者 是当前线程所持有的写锁再加读锁
是当前线程的锁
读锁
其实这里就是判断,当前线程是否还持有锁,如果不存在,就不用进行解锁了,直接返回
-1 后 > 0
加锁
判断test中是否有当前线程的key UUID_01:threadId_01
counter == 0
lockExists == 0
return test ttl
循环获取{test}开头的timeoutkey的数据中,最大的一个剩余生存时间maxRemainTime (默认 -3)
注意:加了读锁,则其他读锁可以进行加锁,但是不能加写锁加了写锁,则其他线程不管读锁、写锁都不能再加**同一个线程:先加了读锁,不能加写锁,但是,先加了写锁,能再加读写锁**读锁key:UUID:threadId01 写锁key:UUID:threadId01 :write
hset hash结构中插入数据,set string类型数据1、hset 设置test值 {\"mode\":\"write\"}2、hset 设置test的 {\"UUID:1:writespan style=\
这里有一点需要注意就是:如果释放锁的的时候,和锁相关的 rwlock_timeout 都已经没有了,然后这时候 [ test 中的剩余key是否 > 1 ] ,那他如果不是mode = write的话,这个锁就会被释放也就是:同一个test锁,如果timeout都超时删除之后,释放锁的时候,会直接删除整个锁,我的理解是:如果加锁之后,30S都没新的线程来操作这个加锁,那这个锁就会在释放的时候,统一释放
说明当前线程还持有写锁的重入
mode = write已经被加了写锁
设置 test 的有效期为:maxRemainTime
写锁
注意:就是这里如果是写锁,能再加读锁1、hincrby 设置当前线程的kay的值,进行 ++ (如果当前线程是读锁:则当前的值就进行 +1 )(如果当前线程是写锁:则当前的值就设置 1 )2、获取当前锁的过期时间3、设置 test 过期时间 30s+第二步获取的锁的剩余时间
是
0 条评论
回复 删除
下一页