0%
About Redisson Lock
這篇介紹Redisson Lock。
Reentrant Lock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| RLock lock = redisson.getLock("ReentrantLock"); try{ // 最常見的使用方法 lock.lock();
// 10秒自動解鎖 lock.lock(10, TimeUnit.SECONDS);
// 最多等3秒,上鎖後10秒自動解鎖 boolean res = lock.tryLock(3, 10, TimeUnit.SECONDS); if (res) { // do your business } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); }
|
Reentrant Lock with Async
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| RLock lock = redisson.getLock("ReentrantLock"); try{ lock.lockAsync(); lock.lockAsync(10, TimeUnit.SECONDS); Future<Boolean> res = lock.tryLockAsync(3, 10, TimeUnit.SECONDS);
if(res.get()){ // do your business } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } finally { lock.unlock(); }
|
Fair Lock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| RLock fairLock = redisson.getFairLock("FairLock"); try{ // 最常見的使用方法 fairLock.lock();
// 10秒自動解鎖 fairLock.lock(10, TimeUnit.SECONDS);
// 最多等10秒,上鎖後100秒自動解鎖 boolean res = fairLock.tryLock(10, 100, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } finally { fairLock.unlock(); }
|
Fair Lock with Async
1 2 3 4
| RLock fairLock = redisson.getFairLock("FairLock"); fairLock.lockAsync(); fairLock.lockAsync(10, TimeUnit.SECONDS); Future<Boolean> res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS);
|
Multi Lock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| RLock lock1 = redisson1.getLock("lock1"); RLock lock2 = redisson2.getLock("lock2"); RLock lock3 = redisson3.getLock("lock3");
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
try { // 同時加鎖:lock1 lock2 lock3, 所有的鎖都上鎖成功才算成功。 lock.lock();
// 最多等10秒,上鎖後100秒自動解鎖 boolean res = lock.tryLock(10, 100, TimeUnit.SECONDS);
} catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); }
|
Red Lock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| RLock lock1 = redisson1.getLock("lock1"); RLock lock2 = redisson2.getLock("lock2"); RLock lock3 = redisson3.getLock("lock3");
RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3); try { // 同時加鎖:lock1 lock2 lock3, 紅鎖在大部分節點上加鎖成功就算成功。 lock.lock();
// 最多等10秒,上鎖後100秒自動解鎖 boolean res = lock.tryLock(10, 100, TimeUnit.SECONDS);
} catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); }
|
ReadWriteLock
1 2 3 4 5 6 7 8 9 10 11 12 13
| RReadWriteLock rwlock = redisson.getLock("ReadWriteLock"); rwlock.readLock().lock(); rwlock.writeLock().lock();
// 10秒自動解鎖 rwlock.readLock().lock(10, TimeUnit.SECONDS); rwlock.writeLock().lock(10, TimeUnit.SECONDS);
// 最多等10秒,上鎖後100秒自動解鎖 boolean res = rwlock.readLock().tryLock(10, 100, TimeUnit.SECONDS); boolean res = rwlock.writeLock().tryLock(10, 100, TimeUnit.SECONDS);
rwlock.unlock();
|
Semaphore
1 2 3 4 5 6 7 8 9 10 11
| RSemaphore semaphore = redisson.getSemaphore("semaphore"); semaphore.acquire(); semaphore.acquireAsync(); semaphore.acquire(23); semaphore.tryAcquire(); semaphore.tryAcquireAsync(); semaphore.tryAcquire(23, TimeUnit.SECONDS); semaphore.tryAcquireAsync(23, TimeUnit.SECONDS); semaphore.release(10); semaphore.release(); semaphore.releaseAsync();
|
PermitExpirableSemaphore
1 2 3 4 5
| RPermitExpirableSemaphore semaphore = redisson.getPermitExpirableSemaphore("mySemaphore"); String permitId = semaphore.acquire(); // 有效期兩秒 String permitId = semaphore.acquire(2, TimeUnit.SECONDS); semaphore.release(permitId);
|
CountDownLatch
1 2 3 4 5 6 7
| RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch"); latch.trySetCount(1); latch.await();
// 在其它Thread RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch"); latch.countDown();
|