Redisson 还支持可重入读写锁,允许在分布式场景下,同时有多个读锁和一个写锁处于加锁状态。
Redisson 读写锁实现了 JUC 下的 ReadWriteLock
,使用方式基本相同。
加锁源码基本和之前的可重入锁加锁无区别,唯一的差异就是在 Lua 脚本这里。
所以下面着重分析 Lua 脚本。
源码地址:org.redisson.RedissonReadLock#tryLockInnerAsync
参数列表:
{锁名字}:UUID:ThreadId:rwlock_timeout
组成的字符串,{anyRWLock}:e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:rwlock_timeoutUUID:ThreadId
组成的字符串,e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1getWriteLockName(threadId)
写锁名字,UUID:ThreadId:write
组成的字符串, e70b1307-9ddd-43de-ac9d-9c42b5c99a0d:1:write如果是重入的情况下:
已经加了读锁了,此时写锁进来,不满足第一部分,也不满足第二部分,所以直接返回当前锁的剩余时间。
然后再 Java 代码中进行 while (true)
自旋等待。
通过上面可以看出,在读锁的时候:
mode = read
表示读锁UUID:ThreadId
字段,值表示重入次数{锁名字}:UUID:ThreadId:rwlock_timeout:重入次数
源码地址:org.redisson.RedissonWriteLock#tryLockInnerAsync
参数列表:
UUID:ThreadId:write
组成的字符串,c69a9ed4-5c30-4952-814e-c0b94ad03a7f:1:write写锁源码相对比较好理解:
这么下来,可以看出直接满足,写写互斥,读写互斥,当前线程又可以重入。
到这里基本上读写锁就看完了,读锁实现的稍微复杂一些,写锁简单明了。
在读锁的时候:
mode = read
表示读锁UUID:ThreadId
字段,值表示重入次数{锁名字}:UUID:ThreadId:rwlock_timeout:重入次数
在写锁的时候:
mode = write
表示写锁UUID:ThreadId:write
表示重入次数至于看门狗,这些都和之前的一样,就不额外介绍了。
- <End /> -