redisson分布式锁

RLock官网解释

基于Redis的Java分布式可重入锁对象,实现了锁接口。

如果获得锁的Redisson实例崩溃,那么这种锁可能永远挂起在获得状态。为了避免这种情况,Redisson维护了锁看门狗,它在锁持有者Redisson实例活着的时候延长锁过期时间。默认情况下,看门狗的超时时间为30秒,可以通过配置进行修改。lockWatchdogTimeout设置。

可以定义锁获取期间的leaseTime参数。在设定的时间间隔后,锁自动释放。

RLock对象的行为符合Java Lock规范。这意味着只有锁所有者线程可以解锁它,否则将抛出IllegalMonitorStateException。否则考虑使用RSemaphore对象。

总结下来就是

  • 特性:可重入锁
  • 看门狗默认时间:30秒
  • 释放锁时要关注当前线程是否拥有锁
java 复制代码
//获取锁对象
RLock lock = redisson.getLock("myLock");

//传统加锁方法
lock.lock();

//或者获得锁并在10秒后自动解锁
lock.lock(10, TimeUnit.SECONDS);

//加锁阻塞等待时间100秒,且获得锁10秒后自动释放锁
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
   try {
     ...
   } finally {
       lock.unlock();
   }
}

自定义的锁方法

java 复制代码
/**
     * 获取锁
     * @param lockName
     * @return
     */
    public static RLock getLock(String lockName){
        RLock rLock = redissonClient.getLock(lockName);
        if(rLock.isLocked()){
            return null;
        }
        rLock.lock(default_lease_time, TimeUnit.SECONDS);
        return rLock;
    }


    /**
     * 获取锁
     * @param lockName
     * @param waitTime 阻塞时间(秒)
     * @return
     */
    public static RLock getLock(String lockName, long waitTime){
        RLock rLock = redissonClient.getLock(lockName);
        try {
            boolean resp = rLock.tryLock(waitTime, default_lease_time,TimeUnit.SECONDS);
            if(resp){
                return rLock;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 释放锁
     * @param lock
     */
    public static void unlock(RLock lock){
        if(ObjectUtils.isEmpty(lock)){
            return;
        }
        if(!lock.isLocked()){
            return;
        }
        lock.unlock();
    }

除此,官网还有其他几个所对想,具体参考redisson

相关推荐
wuqingshun3141591 小时前
什么是责任链模式,一般用在什么场景?
java·责任链模式
:-)2 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
wuqingshun3141592 小时前
说一下消息队列的模型有哪些?
java
白露与泡影3 小时前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
fīɡЙtīиɡ ℡3 小时前
布隆过滤器
java
Steadfast_GG4 小时前
Redis典型应用 - 缓存,缓存更新策略,内存淘汰策略,缓存预热,缓存穿透,缓存雪崩,缓存击穿
redis·缓存穿透·缓存击穿·缓存雪崩·缓存预热·缓存更新策略·内存淘汰策略
yaoxin5211234 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
ACP广源盛139246256734 小时前
IX8024@ACP# 搭配此芯 AI 服务器 + 爱芯元智产品完整方案
大数据·运维·服务器·人工智能·分布式·嵌入式硬件
wuqingshun3141596 小时前
MYSQL的乐观锁和悲观锁是什么?
java
唐青枫7 小时前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java