1. 可重入锁(Reentrant Lock)
功能:支持同一线程多次获取同一把锁(重入),避免死锁;支持锁自动过期和手动解锁。
实现:通过Redis的Hash结构记录锁持有者的线程标识和重入次数。若锁存在且线程标识匹配,重入次数递增;解锁时递减,直至次数为0才释放锁。
使用示例:
1 | RLock lock = redisson.getLock("anyLock"); |
2. 公平锁(Fair Lock)
功能:在多个线程竞争时,按请求顺序分配锁,确保先到先得;同样支持可重入和自动续期。
实现:通过Redis的队列维护请求顺序,线程按队列顺序依次获取锁。
使用示例:
1 | RLock fairLock = redisson.getFairLock("anyLock"); |
3. 联锁(MultiLock)
功能:将多个独立的锁(可来自不同Redis实例)绑定为一个联锁,要求所有锁同时获取成功才算加锁成功。
适用场景:需跨多个资源或服务强一致加锁的场景。
使用示例:
1 | RLock lock1 = redisson1.getLock("lock1"); |
4. 红锁(RedLock)
功能:基于RedLock算法,在多个Redis节点(通常为奇数)上加锁,超过半数成功即视为加锁成功,提升高可用性。
与联锁区别:联锁要求全部成功,红锁仅需多数成功,容错性更高。
使用示例:
1 | RLock lock1 = redisson1.getLock("lock1"); |
5. 读写锁(ReadWriteLock)
功能:实现读-写分离,允许多个读锁共存,但写锁独占。适用于读多写少场景。
实现:通过Redis的Hash结构区分读锁和写锁,写锁存在时禁止其他锁获取。
使用示例:
1 | RReadWriteLock rwLock = redisson.getReadWriteLock("anyRWLock"); |
6. 信号量(Semaphore)
功能:控制并发线程数,限制同时访问资源的线程数量。
实现:通过Redis的计数器实现,获取信号量时计数器减1,释放时加1。
使用示例:
1 | RSemaphore semaphore = redisson.getSemaphore("semaphore"); |
7. 闭锁(CountDownLatch)
功能:等待多个线程完成操作后再继续执行,类似Java的CountDownLatch。
实现:通过Redis的计数器递减,计数为0时唤醒等待线程。
使用示例:
1 | RCountDownLatch latch = redisson.getCountDownLatch("latch"); |