世界以痛吻我,我仍报之以歌。
可重入锁(Reentrant Lock)
基础使用示例:
1 |
|
加锁以后10秒钟自动解锁示例:
1 |
|
尝试加锁,最多等待20秒示例:
1 |
|
尝试加锁,最多等待20秒,上锁后10秒自动解锁示例:
1 |
|
异步加锁示例:
lockAsync() 相比较 lock() 的区别是不阻塞主流程;lock() 必须加锁成功后才能顺序执行下面的代码;而 lockAsync() 不用等待加锁是否成功,继续执行下面的代码。
1 |
|
如果负责储存这个分布式锁的 Redisson 节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson 内部提供了一个监控锁的看门狗,它的作用是在 Redisson 实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改 Config.lockWatchdogTimeout 来另行指定。
公平锁(Fair Lock)
它保证了当多个 Redisson 客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson 会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒。
基础使用示例:
1 |
|
加锁以后10秒钟自动解锁示例:
1 |
|
尝试加锁,最多等待20秒示例:
1 |
|
尝试加锁,最多等待20秒,上锁后10秒自动解锁示例:
1 |
|
异步加锁示例:
1 |
|
联锁(MultiLock)
基于 Redis 的 Redisson 分布式联锁 RedissonMultiLock 对象可以将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例可以来自于不同的 Redisson 实例。
基础使用示例:
1 |
|
加锁超时示例:
1 |
|
红锁(RedLock)
基于 Redis 的 Redisson 红锁 RedissonRedLock 对象实现了 Redlock 介绍的加锁算法。该对象也可以用来将多个 RLock 对象关联为一个红锁,每个 RLock 对象实例可以来自于不同的 Redisson 实例。
基础使用示例:
1 |
|
加锁超时示例:
1 |
|
读写锁(ReadWriteLock)
ReadWriteLock 管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。
分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。
基础使用示例:
1 |
|
加锁超时示例:
1 |
|
信号量(Semaphore)
用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。
可以把它简单的理解成我们停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车辆就会加1,当显示屏上的剩余车位为0时,停车场入口的栏杆就不会再打开,车辆就无法进入停车场了,直到有一辆车从停车场出去为止。
基础使用示例:
1 |
|
可过期性信号量(PermitExpirableSemaphore)
在RSemaphore对象的基础上,为每个信号增加了一个过期时间。每个信号可以通过独立的ID来辨识,释放时只能通过提交这个ID才能释放。
基础使用示例:
1 |
|
闭锁(CountDownLatch)
CountDownLatch 有一个正数计数器,countDown() 方法对计数器做减操作,await() 方法等待计数器达到0。所有 await 的线程都会阻塞直到计数器为0或者等待线程中断或者超时。
基础使用示例:
1 |
|