NO.1

背景

NO.2

API分析

Config config = new Config();config.useClusterServers().addNodeAddress("redis://192.168.1.15:6379");RedissonClient client = Redisson.create(config);RLock lock = client.getLock("anyLock");lock.tryLock(100, TimeUnit.SECONDS);lock.unlock();


下面我们来看一下,tryLock的底层是怎么来完成超时的控制的

@Overridepublic boolean tryLock(long waitTime, TimeUnit unit) throws InterruptedException {return tryLock(waitTime, -1, unit);}@Overridepublic boolean tryLock(long waitTime, long leaseTime, TimeUnit unit) throws InterruptedException {long time = unit.toMillis(waitTime);long current = System.currentTimeMillis();long threadId = Thread.currentThread().getId();Long ttl = tryAcquire(waitTime, leaseTime, unit, threadId);// lock acquiredif (ttl == null) {return true;}time -= System.currentTimeMillis() - current;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}current = System.currentTimeMillis();RFuture<RedissonLockEntry> subscribeFuture = subscribe(threadId);if (!subscribeFuture.await(time, TimeUnit.MILLISECONDS)) {if (!subscribeFuture.cancel(false)) {subscribeFuture.onComplete((res, e) -> {if (e == null) {unsubscribe(subscribeFuture, threadId);}});}acquireFailed(waitTime, unit, threadId);return false;}try {time -= System.currentTimeMillis() - current;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}while (true) {long currentTime = System.currentTimeMillis();ttl = tryAcquire(waitTime, leaseTime, unit, threadId);// lock acquiredif (ttl == null) {return true;}time -= System.currentTimeMillis() - currentTime;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}// waiting for messagecurrentTime = System.currentTimeMillis();if (ttl >= 0 && ttl < time) {subscribeFuture.getNow().getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);} else {subscribeFuture.getNow().getLatch().tryAcquire(time, TimeUnit.MILLISECONDS);}time -= System.currentTimeMillis() - currentTime;if (time <= 0) {acquireFailed(waitTime, unit, threadId);return false;}}} finally {unsubscribe(subscribeFuture, threadId);}}
分析代码逻辑如下:
先尝试获取分布式锁(这里的逻辑我们前面解析了,这里就不在重复解析),如果获取成功,那么皆大欢喜,就直接返回加锁成功,如果获取锁失败则会执行下面的逻辑
用等待时间减去获取锁的时间,来计算剩余时间
判断剩余时间是否小于0,小于0说明第一次尝试获取锁的时间超过我们规定的时间,那么我们则要放弃获取
剩余时间大于0,则会进入循环,不断的尝试获取锁,并且每次都会计算剩余剩余时间
如果在规定的时间内能成功获取锁,则返回加锁成功,如果在规定的时间内没有获取到锁,那么默认加锁失败
NO.3

总结

前面文章的链接如下:

点个在看你最好看
文章转载自程序猿西蒙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




