可重入锁:指一个线程获取某个锁后,可以继续获取该锁,不会产生死锁。可参考黑马的流程图
获取锁
Redisson中trylock源码:
trylock
@Override
public boolean tryLock() {
return get(tryLockAsync());
}
<T> RFuture<T> tryLockInnerAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand<T> command) {
return evalWriteSyncedAsync(getRawName(), LongCodec.INSTANCE, command,
"if ((redis.call('exists', KEYS[1]) == 0) " +
"or (redis.call('hexists', KEYS[1], ARGV[2]) == 1)) then " +
"redis.call('hincrby', KEYS[1], ARGV[2], 1); " +
"redis.call('pexpire', KEYS[1], ARGV[1]); " +
"return nil; " +
"end; " +
"return redis.call('pttl', KEYS[1]);",
Collections.singletonList(getRawName()), unit.toMillis(leaseTime), getLockName(threadId));
}
主要看Lua脚本的代码。其中ARGV[1]代表锁的释放时间,ARGV[2]代表锁的唯一标识。
首先判断Key是否存在或者判断锁是不是自身的,如果True则锁计数+1并且重置锁有效期。反正,则为获取失败。