From 13b83686a016845f237f680b1d2da2989a27062a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E4=B9=8C=E9=BE=9F=E4=B8=8D=E4=BC=9A=E5=86=99?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= <41791762+coding-tortoise@users.noreply.github.com> Date: Tue, 16 Mar 2021 16:52:33 +0800 Subject: [PATCH] fixed concurrency problems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 小乌龟不会写代码 <41791762+coding-tortoise@users.noreply.github.com> --- .../java/org/redisson/RedissonFairLock.java | 6 ++--- .../main/java/org/redisson/RedissonLock.java | 25 +++++++++++-------- .../java/org/redisson/RedissonReadLock.java | 6 ++--- .../java/org/redisson/RedissonWriteLock.java | 6 ++--- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonFairLock.java b/redisson/src/main/java/org/redisson/RedissonFairLock.java index fa8077746..7d696451d 100644 --- a/redisson/src/main/java/org/redisson/RedissonFairLock.java +++ b/redisson/src/main/java/org/redisson/RedissonFairLock.java @@ -100,8 +100,6 @@ public class RedissonFairLock extends RedissonLock implements RLock { @Override RFuture tryLockInnerAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand command) { - internalLockLeaseTime = unit.toMillis(leaseTime); - long wait = threadWaitTime; if (waitTime != -1) { wait = unit.toMillis(waitTime); @@ -150,7 +148,7 @@ public class RedissonFairLock extends RedissonLock implements RLock { "end;" + "return 1;", Arrays.asList(getName(), threadsQueueName, timeoutSetName), - internalLockLeaseTime, getLockName(threadId), currentTime, wait); + unit.toMillis(leaseTime), getLockName(threadId), currentTime, wait); } if (command == RedisCommands.EVAL_LONG) { @@ -227,7 +225,7 @@ public class RedissonFairLock extends RedissonLock implements RLock { "end;" + "return ttl;", Arrays.asList(getName(), threadsQueueName, timeoutSetName), - internalLockLeaseTime, getLockName(threadId), wait, currentTime); + unit.toMillis(leaseTime), getLockName(threadId), wait, currentTime); } throw new IllegalArgumentException(); diff --git a/redisson/src/main/java/org/redisson/RedissonLock.java b/redisson/src/main/java/org/redisson/RedissonLock.java index a0dafbc2e..62049e585 100644 --- a/redisson/src/main/java/org/redisson/RedissonLock.java +++ b/redisson/src/main/java/org/redisson/RedissonLock.java @@ -144,11 +144,14 @@ public class RedissonLock extends RedissonBaseLock { } private RFuture tryAcquireOnceAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) { - if (leaseTime != -1) { - return tryLockInnerAsync(waitTime, leaseTime, unit, threadId, RedisCommands.EVAL_NULL_BOOLEAN); + RFuture ttlRemainingFuture; + if (-1 != leaseTime) { + ttlRemainingFuture = tryLockInnerAsync(waitTime, leaseTime, unit, threadId, RedisCommands.EVAL_NULL_BOOLEAN); + } else { + ttlRemainingFuture = tryLockInnerAsync(waitTime, internalLockLeaseTime, + TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_NULL_BOOLEAN); } - RFuture ttlRemainingFuture = tryLockInnerAsync(waitTime, internalLockLeaseTime, - TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_NULL_BOOLEAN); + ttlRemainingFuture.onComplete((ttlRemaining, e) -> { if (e != null) { return; @@ -156,6 +159,7 @@ public class RedissonLock extends RedissonBaseLock { // lock acquired if (ttlRemaining) { + internalLockLeaseTime = -1 == leaseTime ? internalLockLeaseTime : unit.toMillis(leaseTime); scheduleExpirationRenewal(threadId); } }); @@ -163,11 +167,13 @@ public class RedissonLock extends RedissonBaseLock { } private RFuture tryAcquireAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) { + RFuture ttlRemainingFuture; if (leaseTime != -1) { - return tryLockInnerAsync(waitTime, leaseTime, unit, threadId, RedisCommands.EVAL_LONG); + ttlRemainingFuture = tryLockInnerAsync(waitTime, leaseTime, unit, threadId, RedisCommands.EVAL_LONG); + } else { + ttlRemainingFuture = tryLockInnerAsync(waitTime, internalLockLeaseTime, + TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG); } - RFuture ttlRemainingFuture = tryLockInnerAsync(waitTime, internalLockLeaseTime, - TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG); ttlRemainingFuture.onComplete((ttlRemaining, e) -> { if (e != null) { return; @@ -175,6 +181,7 @@ public class RedissonLock extends RedissonBaseLock { // lock acquired if (ttlRemaining == null) { + internalLockLeaseTime = -1 == leaseTime ? internalLockLeaseTime : unit.toMillis(leaseTime); scheduleExpirationRenewal(threadId); } }); @@ -187,8 +194,6 @@ public class RedissonLock extends RedissonBaseLock { } RFuture tryLockInnerAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand command) { - internalLockLeaseTime = unit.toMillis(leaseTime); - return evalWriteAsync(getName(), LongCodec.INSTANCE, command, "if (redis.call('exists', KEYS[1]) == 0) then " + "redis.call('hincrby', KEYS[1], ARGV[2], 1); " + @@ -201,7 +206,7 @@ public class RedissonLock extends RedissonBaseLock { "return nil; " + "end; " + "return redis.call('pttl', KEYS[1]);", - Collections.singletonList(getName()), internalLockLeaseTime, getLockName(threadId)); + Collections.singletonList(getName()), unit.toMillis(leaseTime), getLockName(threadId)); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonReadLock.java b/redisson/src/main/java/org/redisson/RedissonReadLock.java index 0fa301efc..e40852188 100644 --- a/redisson/src/main/java/org/redisson/RedissonReadLock.java +++ b/redisson/src/main/java/org/redisson/RedissonReadLock.java @@ -55,8 +55,6 @@ public class RedissonReadLock extends RedissonLock implements RLock { @Override RFuture tryLockInnerAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand command) { - internalLockLeaseTime = unit.toMillis(leaseTime); - return evalWriteAsync(getName(), LongCodec.INSTANCE, command, "local mode = redis.call('hget', KEYS[1], 'mode'); " + "if (mode == false) then " + @@ -77,8 +75,8 @@ public class RedissonReadLock extends RedissonLock implements RLock { "return nil; " + "end;" + "return redis.call('pttl', KEYS[1]);", - Arrays.asList(getName(), getReadWriteTimeoutNamePrefix(threadId)), - internalLockLeaseTime, getLockName(threadId), getWriteLockName(threadId)); + Arrays.asList(getName(), getReadWriteTimeoutNamePrefix(threadId)), + unit.toMillis(leaseTime), getLockName(threadId), getWriteLockName(threadId)); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonWriteLock.java b/redisson/src/main/java/org/redisson/RedissonWriteLock.java index 7cb349403..c985294fc 100644 --- a/redisson/src/main/java/org/redisson/RedissonWriteLock.java +++ b/redisson/src/main/java/org/redisson/RedissonWriteLock.java @@ -52,8 +52,6 @@ public class RedissonWriteLock extends RedissonLock implements RLock { @Override RFuture tryLockInnerAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId, RedisStrictCommand command) { - internalLockLeaseTime = unit.toMillis(leaseTime); - return evalWriteAsync(getName(), LongCodec.INSTANCE, command, "local mode = redis.call('hget', KEYS[1], 'mode'); " + "if (mode == false) then " + @@ -71,8 +69,8 @@ public class RedissonWriteLock extends RedissonLock implements RLock { "end; " + "end;" + "return redis.call('pttl', KEYS[1]);", - Arrays.asList(getName()), - internalLockLeaseTime, getLockName(threadId)); + Arrays.asList(getName()), + unit.toMillis(leaseTime), getLockName(threadId)); } @Override