About Redisson Lock

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();