2021-06-27 11:22:13.753 INFO 1128 — [ Thread-3] c.n.r.SpringbootRedissonApplicationTests : 进入thread1 ======
2021-06-27 11:22:13.754 INFO 1128 — [ Thread-4] c.n.r.SpringbootRedissonApplicationTests : 进入thread2 ======
2021-06-27 11:22:13.754 INFO 1128 — [ Thread-3] c.n.r.SpringbootRedissonApplicationTests : thread1 正在尝试获取锁。。。
2021-06-27 11:22:13.754 INFO 1128 — [ Thread-5] c.n.r.SpringbootRedissonApplicationTests : 进入thread3 ======
2021-06-27 11:22:13.796 INFO 1128 — [ Thread-3] c.n.r.SpringbootRedissonApplicationTests : 线程:thread1,获取到了锁
2021-06-27 11:22:15.759 INFO 1128 — [ Thread-4] c.n.r.SpringbootRedissonApplicationTests : thread2 休眠结束 正在尝试获取锁。。。
2021-06-27 11:22:16.767 INFO 1128 — [ Thread-5] c.n.r.SpringbootRedissonApplicationTests : thread3 休眠结束 正在尝试获取锁。。。
2021-06-27 11:22:18.810 INFO 1128 — [ Thread-3] c.n.r.SpringbootRedissonApplicationTests : 线程:thread1 正在释放了锁
2021-06-27 11:22:18.867 INFO 1128 — [ Thread-4] c.n.r.SpringbootRedissonApplicationTests : 线程:thread2,获取到了锁
2021-06-27 11:22:23.869 INFO 1128 — [ Thread-4] c.n.r.SpringbootRedissonApplicationTests : 线程:thread2 正在释放了锁
2021-06-27 11:22:23.912 INFO 1128 — [ Thread-5] c.n.r.SpringbootRedissonApplicationTests : 线程:thread3,获取到了锁
2021-06-27 11:22:28.914 INFO 1128 — [ Thread-5] c.n.r.SpringbootRedissonApplicationTests : 线程:thread3 正在释放了锁
基于Redis的Redisson分布式联锁RedissonMultiLock对象可以将多个RLock对象关联为一个联锁,每个RLock对象实例可以来自于不同的Redisson实例。
联锁指的是:同时对多个资源进行加索操作,只有所有资源都加锁成功的时候,联锁才会成功。
@Test
public void testMultiLock(){
RLock lock1 = redissonTemplate.getLock(“lock1” );
RLock lock2 = redissonTemplate.getLock(“lock2”);
RLock lock3 = redissonTemplate.getLock(“lock3”);
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
boolean flag = lock.tryLock();
if(flag){
try {
log.info(“联锁加索成功”);
}finally {
//一定要释放锁
lock.unlock();
}
}
}
基于Redis的Redisson红锁RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock对象关联为一个红锁,每个RLock对象实例可以来自于不同的Redisson实例
与联锁比较相似,都是对多个资源进行加锁,但是红锁与连锁不同的是,红锁只需要在大部分资源加锁成功即可,
/**
- 红锁
*/
@Test
public void testRedLock(){
RLock lock1 = redissonTemplate.getLock(“lock1” );
RLock lock2 = redissonTemplate.getLock(“lock2”);
RLock lock3 = redissonTemplate.getLock(“lock3”);
RedissonRedLock lock = new RedissonRedLock (lock1, lock2, lock3);
boolean flag = lock.tryLock();
if(flag){
try {
log.info(“红锁加索成功”);
}finally {
//一定要释放锁
lock.unlock();
}
}
}
基于Redis的Redisson分布式可重入读写锁RReadWriteLock Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。其中读锁和写锁都继承了RLock接口。
分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。这点相当于java并发sdk并发包中的 StampedLock 。
如果大家对读写锁还不太熟悉的话,可以参考我的另外两篇文章:
【并发编程】java并发编程之ReentrantReadWriteLock读写锁
/**
- 读写锁
*/
@Test
public void testReadWriteLock(){
RReadWriteLock rwlock = redissonTemplate.getReadWriteLock(“testRWLock”);
rwlock.readLock().lock();
rwlock.writeLock().lock();
}
/**
-
获取读写锁
-
@param lockName
-
@return
*/
public RReadWriteLock getReadWriteLock(String lockName) {
return redissonClient.getReadWriteLock(lockName);
}
基于Redis的Redisson的分布式信号量(Semaphore)Java对象RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。同时还提供了异步(Async)、反射式(Reactive)和RxJava2标准的接口。
/**
-
信号量
-
@param semaphoreName
-
@return
*/
public RSemaphore getSemaphore(String semaphoreName) {
return redissonClient.getSemaphore(semaphoreName);
}
/**
- 信号量
*/
@Test
public void testSemaphore() throws InterruptedException {
RSemaphor