Redisson readWriteLock
2019-07-16 07:45
1376 查看
Redisson readWriteLock 其实是通过两个类:
- RedissonReadLock
- RedissonWriteLock
核心代码就是这两个类里面的script,如readlock的获取读锁如下
return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, command, "local mode = redis.call('hget', KEYS[1], 'mode'); " + //锁不存在 "if (mode == false) then " + //设置hash内容 "redis.call('hset', KEYS[1], 'mode', 'read'); " + "redis.call('hset', KEYS[1], ARGV[2], 1); " + //设置一个{lock}:6ebc68ab-79ce-42d7-9c7d-00401fab055e:1:rwlock_timeout:1 对象,注意结尾是:1 "redis.call('set', KEYS[2] .. ':1', 1); " + "redis.call('pexpire', KEYS[2] .. ':1', ARGV[1]); " + "redis.call('pexpire', KEYS[1], ARGV[1]); " + "return nil; " + "end; " + "if (mode == 'read') or (mode == 'write' and redis.call('hexists', KEYS[1], ARGV[3]) == 1) then " + //如果当前是读锁,或者写锁也是由当前线程获得 "local ind = redis.call('hincrby', KEYS[1], ARGV[2], 1); " + "local key = KEYS[2] .. ':' .. ind;" + "redis.call('set', key, 1); " + "redis.call('pexpire', key, ARGV[1]); " + "local remainTime = redis.call('pttl', KEYS[1]); " + "redis.call('pexpire', KEYS[1], math.max(remainTime, ARGV[1])); " + "return nil; " + "end;" + "return redis.call('pttl', KEYS[1]);", Arrays.<Object>asList(getName(), getReadWriteTimeoutNamePrefix(threadId)), internalLockLeaseTime, getLockName(threadId), getWriteLockName(threadId));
可以看到几点:
- 以hash模式存放
- 整个hash设置了过期时间,即会自动释放锁
- 锁也设置了过期时间
相关文章推荐
- Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock
- JDK 5.0 Concurrency Utilities 并发处理(3)ReadWriteLock 读写锁
- ReentrantReadWriteLock和两种同步方式的对比
- java多线程学习之ReentrantReadWriteLock(一)
- Java并发编程总结3——AQS、ReentrantLock、ReentrantReadWriteLock
- 【Java多线程】ReentrantReadWriteLock
- ReentrantReadWriteLock
- Technique Java. ReentrantReadWriteLock
- ReentrantReadWriteLock可重入读写锁分析
- J.U.C并发框架源码阅读(十七)ReentrantReadWriteLock
- Java - "JUC" ReentrantReadWriteLock
- java做一个缓存类(应用TimerTask和ReadWriteLock)
- Java的ReadWriteLock实现机制解析(一)
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- CopyOnWriteArrayList----ReadWriteLock---ConcurrentHashMap
- Python recipe(16):ReadWriteLock
- Java常见Lock(三): lock之ReadWriteLock、ReentrantReadWriteLock
- ReadWriteLock的理解
- 第6章-ReadWriteLock
- ReentrantReadWriteLock 学习