可重入锁:指一个线程获取某个锁后,可以继续获取该锁,不会产生死锁。可参考黑马的流程图

获取锁

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并且重置锁有效期。反正,则为获取失败。

最后修改:2024 年 05 月 04 日
如果觉得我的文章对你有用,请随意赞赏