diff --git a/redisson/src/main/java/org/redisson/RedissonMultiLock.java b/redisson/src/main/java/org/redisson/RedissonMultiLock.java index 3ae8abaa2..64fb8fbe4 100644 --- a/redisson/src/main/java/org/redisson/RedissonMultiLock.java +++ b/redisson/src/main/java/org/redisson/RedissonMultiLock.java @@ -24,7 +24,6 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.Lock; import org.redisson.api.RFuture; import org.redisson.api.RLock; @@ -39,7 +38,7 @@ import org.redisson.misc.TransferListener; * @author Nikita Koksharov * */ -public class RedissonMultiLock implements Lock { +public class RedissonMultiLock implements RLock { class LockState { @@ -74,7 +73,7 @@ public class RedissonMultiLock implements Lock { lockWaitTime = calcLockWaitTime(remainTime); failedLocksLimit = failedLocksLimit(); - acquiredLocks = new ArrayList<RLock>(locks.size()); + acquiredLocks = new ArrayList<>(locks.size()); } void tryAcquireLockAsync(ListIterator<RLock> iterator, RPromise<Boolean> result) { @@ -147,7 +146,7 @@ public class RedissonMultiLock implements Lock { if (leaseTime != -1) { AtomicInteger counter = new AtomicInteger(acquiredLocks.size()); for (RLock rLock : acquiredLocks) { - RFuture<Boolean> future = rLock.expireAsync(unit.toMillis(leaseTime), TimeUnit.MILLISECONDS); + RFuture<Boolean> future = ((RedissonLock) rLock).expireAsync(unit.toMillis(leaseTime), TimeUnit.MILLISECONDS); future.onComplete((res, e) -> { if (e != null) { result.tryFailure(e); @@ -187,7 +186,7 @@ public class RedissonMultiLock implements Lock { } - final List<RLock> locks = new ArrayList<RLock>(); + final List<RLock> locks = new ArrayList<>(); /** * Creates instance with multiple {@link RLock} objects. @@ -211,6 +210,7 @@ public class RedissonMultiLock implements Lock { } } + @Override public void lock(long leaseTime, TimeUnit unit) { try { lockInterruptibly(leaseTime, unit); @@ -219,10 +219,12 @@ public class RedissonMultiLock implements Lock { } } + @Override public RFuture<Void> lockAsync(long leaseTime, TimeUnit unit) { return lockAsync(leaseTime, unit, Thread.currentThread().getId()); } + @Override public RFuture<Void> lockAsync(long leaseTime, TimeUnit unit, long threadId) { long baseWaitTime = locks.size() * 1500; long waitTime = -1; @@ -266,6 +268,7 @@ public class RedissonMultiLock implements Lock { lockInterruptibly(-1, null); } + @Override public void lockInterruptibly(long leaseTime, TimeUnit unit) throws InterruptedException { long baseWaitTime = locks.size() * 1500; long waitTime = -1; @@ -301,7 +304,7 @@ public class RedissonMultiLock implements Lock { } protected void unlockInner(Collection<RLock> locks) { - List<RFuture<Void>> futures = new ArrayList<RFuture<Void>>(locks.size()); + List<RFuture<Void>> futures = new ArrayList<>(locks.size()); for (RLock lock : locks) { futures.add(lock.unlockAsync()); } @@ -362,7 +365,7 @@ public class RedissonMultiLock implements Lock { long lockWaitTime = calcLockWaitTime(remainTime); int failedLocksLimit = failedLocksLimit(); - List<RLock> acquiredLocks = new ArrayList<RLock>(locks.size()); + List<RLock> acquiredLocks = new ArrayList<>(locks.size()); for (ListIterator<RLock> iterator = locks.listIterator(); iterator.hasNext();) { RLock lock = iterator.next(); boolean lockAcquired; @@ -414,9 +417,9 @@ public class RedissonMultiLock implements Lock { } if (leaseTime != -1) { - List<RFuture<Boolean>> futures = new ArrayList<RFuture<Boolean>>(acquiredLocks.size()); + List<RFuture<Boolean>> futures = new ArrayList<>(acquiredLocks.size()); for (RLock rLock : acquiredLocks) { - RFuture<Boolean> future = rLock.expireAsync(unit.toMillis(leaseTime), TimeUnit.MILLISECONDS); + RFuture<Boolean> future = ((RedissonLock) rLock).expireAsync(unit.toMillis(leaseTime), TimeUnit.MILLISECONDS); futures.add(future); } @@ -428,7 +431,7 @@ public class RedissonMultiLock implements Lock { return true; } - + @Override public RFuture<Boolean> tryLockAsync(long waitTime, long leaseTime, TimeUnit unit, long threadId) { RPromise<Boolean> result = new RedissonPromise<Boolean>(); LockState state = new LockState(waitTime, leaseTime, unit, threadId); @@ -436,6 +439,7 @@ public class RedissonMultiLock implements Lock { return result; } + @Override public RFuture<Boolean> tryLockAsync(long waitTime, long leaseTime, TimeUnit unit) { return tryLockAsync(waitTime, leaseTime, unit, Thread.currentThread().getId()); } @@ -445,13 +449,14 @@ public class RedissonMultiLock implements Lock { return remainTime; } + @Override public RFuture<Void> unlockAsync(long threadId) { return unlockInnerAsync(locks, threadId); } @Override public void unlock() { - List<RFuture<Void>> futures = new ArrayList<RFuture<Void>>(locks.size()); + List<RFuture<Void>> futures = new ArrayList<>(locks.size()); for (RLock lock : locks) { futures.add(lock.unlockAsync()); @@ -462,10 +467,79 @@ public class RedissonMultiLock implements Lock { } } - @Override public Condition newCondition() { throw new UnsupportedOperationException(); } + @Override + public RFuture<Boolean> forceUnlockAsync() { + throw new UnsupportedOperationException(); + } + + @Override + public RFuture<Void> unlockAsync() { + return unlockAsync(Thread.currentThread().getId()); + } + + @Override + public RFuture<Boolean> tryLockAsync() { + return tryLockAsync(Thread.currentThread().getId()); + } + + @Override + public RFuture<Void> lockAsync() { + return lockAsync(Thread.currentThread().getId()); + } + + @Override + public RFuture<Void> lockAsync(long threadId) { + return lockAsync(-1, null, threadId); + } + + @Override + public RFuture<Boolean> tryLockAsync(long threadId) { + return tryLockAsync(-1, -1, null, threadId); + } + + @Override + public RFuture<Boolean> tryLockAsync(long waitTime, TimeUnit unit) { + return tryLockAsync(waitTime, -1, unit); + } + + @Override + public RFuture<Integer> getHoldCountAsync() { + throw new UnsupportedOperationException(); + } + + @Override + public String getName() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean forceUnlock() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isLocked() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isHeldByThread(long threadId) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isHeldByCurrentThread() { + throw new UnsupportedOperationException(); + } + + @Override + public int getHoldCount() { + throw new UnsupportedOperationException(); + } + } diff --git a/redisson/src/main/java/org/redisson/api/RLock.java b/redisson/src/main/java/org/redisson/api/RLock.java index b4d9e814a..7615288c8 100644 --- a/redisson/src/main/java/org/redisson/api/RLock.java +++ b/redisson/src/main/java/org/redisson/api/RLock.java @@ -27,8 +27,15 @@ import java.util.concurrent.locks.Lock; * */ -public interface RLock extends Lock, RExpirable, RLockAsync { +public interface RLock extends Lock, RLockAsync { + /** + * Returns name of object + * + * @return name - name of object + */ + String getName(); + /** * Acquires the lock. * @@ -87,7 +94,7 @@ public interface RLock extends Lock, RExpirable, RLockAsync { /** * Unlocks lock independently of state * - * @return <code>true</code> if unlocked otherwise <code>false</code> + * @return <code>true</code> if lock existed and now unlocked otherwise <code>false</code> */ boolean forceUnlock(); diff --git a/redisson/src/main/java/org/redisson/api/RLockAsync.java b/redisson/src/main/java/org/redisson/api/RLockAsync.java index 36afff515..acf39adf2 100644 --- a/redisson/src/main/java/org/redisson/api/RLockAsync.java +++ b/redisson/src/main/java/org/redisson/api/RLockAsync.java @@ -23,12 +23,12 @@ import java.util.concurrent.TimeUnit; * @author Nikita Koksharov * */ -public interface RLockAsync extends RExpirableAsync { +public interface RLockAsync { /** * Unlocks the lock independently of state * - * @return <code>true</code> if unlocked otherwise <code>false</code> + * @return <code>true</code> if lock existed and now unlocked otherwise <code>false</code> */ RFuture<Boolean> forceUnlockAsync(); diff --git a/redisson/src/main/java/org/redisson/api/RLockReactive.java b/redisson/src/main/java/org/redisson/api/RLockReactive.java index b6e17c2b9..8cbca1441 100644 --- a/redisson/src/main/java/org/redisson/api/RLockReactive.java +++ b/redisson/src/main/java/org/redisson/api/RLockReactive.java @@ -25,8 +25,15 @@ import reactor.core.publisher.Mono; * @author Nikita Koksharov * */ -public interface RLockReactive extends RExpirableReactive { +public interface RLockReactive { + /** + * Returns name of object + * + * @return name - name of object + */ + String getName(); + /** * Unlocks the lock independently of state * diff --git a/redisson/src/main/java/org/redisson/api/RLockRx.java b/redisson/src/main/java/org/redisson/api/RLockRx.java index 8c916dfaf..c249e757c 100644 --- a/redisson/src/main/java/org/redisson/api/RLockRx.java +++ b/redisson/src/main/java/org/redisson/api/RLockRx.java @@ -25,8 +25,15 @@ import io.reactivex.Flowable; * @author Nikita Koksharov * */ -public interface RLockRx extends RExpirableRx { +public interface RLockRx { + /** + * Returns name of object + * + * @return name - name of object + */ + String getName(); + /** * Unlocks the lock independently of state *