首页 > 数据库 >Redission的几种写法

Redission的几种写法

时间:2022-11-20 21:05:05浏览次数:48  
标签:currentThread Thread getName rLock 几种 unlock Redission 线程 写法


失败无限重试- 多个线程竞争,第一个拿到锁第二个会无限重试

RLock lock = redisson.getLock("码哥字节");

try {

 

  // 1.最常用的第一种写法

  lock.lock();

 

  // 执行业务逻辑

  .....

 

} finally {

  lock.unlock();

}

 

拿锁失败时会不停的重试,具有Watch Dog 自动延期机制,默认续30s 每隔30/3=10 秒续到30s。

watchDog 只有在未显示指定加锁超时时间(leaseTime)时才会生效。

 

 

失败超时重试,自动续命

// 第一次失败后,尝试拿锁10s后停止重试,获取失败返回false,具有Watch Dog 自动延期机制, 默认续30s 业务逻辑没执行完会自动续期

boolean flag = lock.tryLock(10, TimeUnit.SECONDS);

 

 

超时自动释放锁

// 没有Watch Dog ,10s后自动释放,不需要调用 unlock 释放锁。

lock.lock(10, TimeUnit.SECONDS);

 

超时重试,自动解锁

// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁,没有 Watch dog

boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);

if (res) {

   try {

     ...

   } finally {

       lock.unlock();

   }

}

 

 

具体使用方法详见下面代码

 public void  lock() throws InterruptedException{

        log.info("线程:{},进入方法",Thread.currentThread().getName());

        RLock rLock = redissonClient.getLock("lock");

        //加锁:锁的有效期默认30秒

        rLock.lock();

        long timeToLive = rLock.remainTimeToLive();

        log.info("线程:{},获得锁,锁存活时间:{}S",Thread.currentThread().getName(),timeToLive/1000);

        //休眠一下

        Thread.sleep(2000);

   //失败的线程会一直重试,直到获取成功

        //如果主线程未释放,且当前锁未调用unlock方法,则进入到watchDog机制

        //如果主线程未释放,且当前锁调用unlock方法,则直接释放锁

        rLock.unlock();

        log.info("线程:{},释放锁",Thread.currentThread().getName());

    }

 

    public void  lockLaseTime() throws InterruptedException{

        log.info("线程:{},进入方法",Thread.currentThread().getName());

        RLock rLock = redissonClient.getLock("lockLaseTime");

        //加锁 上面是默认30秒,

        //这里可以手动设置锁的有效时间,锁到期后会自动释放的

        rLock.lock(10,TimeUnit.SECONDS);

        long timeToLive = rLock.remainTimeToLive();

        log.info("线程:{},获得锁,锁存活时间:{}S",Thread.currentThread().getName(),timeToLive/1000);

        //休眠一下

        Thread.sleep(2000);

   //设置了时间,没有watchdog机制

        //如果主线程未释放,且当前锁未调用unlock方法,则锁到期后会自动释放的

        //如果主线程未释放,且当前锁调用unlock方法,则直接释放锁

        rLock.unlock();

        log.info("线程:{},释放锁",Thread.currentThread().getName());

    }

 

 

    public void  tryLock() throws InterruptedException {

        log.info("线程:{},进入方法",Thread.currentThread().getName());

        RLock rLock = redissonClient.getLock("tryLock");

        //tryLock()方法是有返回值的,它表示用来尝试获取锁,

        //如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false .

        boolean flag = rLock.tryLock();

        if (flag){

            long timeToLive = rLock.remainTimeToLive();

            log.info("线程:{},获得锁,锁存活时间:{}S,加锁状态:{}",Thread.currentThread().getName(),timeToLive/1000,flag);

            //休眠一下

            Thread.sleep(2000);

       //一般情况下用这个也行,但是没有显示指定锁存在时间

            //如果主线程未释放,且当前锁未调用unlock方法,则进入到watchDog机制

            //如果主线程未释放,且当前锁调用unlock方法,则直接释放锁

            rLock.unlock();

            log.info("线程:{},释放锁",Thread.currentThread().getName());

        }else {

            log.info("线程:{},获得锁失败",Thread.currentThread().getName());

        }

    }

 

    public void  tryLockWaitTime() throws InterruptedException {

        log.info("线程:{},进入方法",Thread.currentThread().getName());

        RLock rLock = redissonClient.getLock("tryLockWaitTime");

        //tryLock(long time, TimeUnit unit)方法和tryLock()方法是类似的,

        //只不过区别在于这个方法在拿不到锁时会等待一定的时间,

        //在时间期限之内如果还拿不到锁,就返回false。如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。

        //这里的6是如果一个线程拿锁失败会在六秒内进行重试

        boolean flag = rLock.tryLock(6, TimeUnit.SECONDS);

        if (flag){

            long timeToLive = rLock.remainTimeToLive();

            log.info("线程:{},获得锁,锁存活时间:{}S,加锁状态:{}",Thread.currentThread().getName(),timeToLive/1000,flag);

            //休眠一下

            Thread.sleep(10000);

            //如果主线程未释放,且当前锁未调用unlock方法,则进入到watchDog机制

            //如果主线程未释放,且当前锁调用unlock方法,则直接释放锁

            rLock.unlock();

            log.info("线程:{},释放锁",Thread.currentThread().getName());

        }else {

            log.info("线程:{},获得锁失败",Thread.currentThread().getName());

        }

 

    }

 

 

    public void  tryLockleasTime() throws InterruptedException {

        log.info("线程:{},进入方法",Thread.currentThread().getName());

        RLock rLock = redissonClient.getLock("tryLockleasTime");

        //比上面多一个参数,多添加一个锁的有效时间

    //锁存在10秒,在11秒内,获取锁失败的线程都会重复的去获取锁,这里第一个参数也可以设置为0,失败就不获取了。

        boolean flag = rLock.tryLock(11,10, TimeUnit.SECONDS);

        if (flag){

            long timeToLive = rLock.remainTimeToLive();

            log.info("线程:{},获得锁,锁存活时间:{}S,加锁状态:{}",Thread.currentThread().getName(),timeToLive/1000,flag);

            //休眠一下

            Thread.sleep(6000);

            //如果主线程未释放,且当前锁未调用unlock方法,则锁到期后会自动释放的

            //如果主线程未释放,且当前锁调用unlock方法,则直接释放锁

            rLock.unlock();

            log.info("线程:{},释放锁",Thread.currentThread().getName());

        }else {

            log.info("线程:{},获得锁失败",Thread.currentThread().getName());

        }

    }

 

标签:currentThread,Thread,getName,rLock,几种,unlock,Redission,线程,写法
From: https://www.cnblogs.com/gustavo/p/16909507.html

相关文章

  • mybatis 之 sql语句写法集锦
    1、mapper接口中的方法存在批量数据操作,接口参数是List类型   在mybatis的xml文件中,使用foreach动态标签拼接SQL语句,每一条数据的更新语句对应一条update语句,......
  • 使用axios发送请求的几种方式
    asyncfetchData(){ //1、异步 /*axios.get('/api/user/list').then((res)=>{console.log(res.data)})*/ //2、同步 /*const......
  • [Swift] SwiftUI布局的一些写法基础(用Swift构造UI布局)
    这个文档是在你 完全熟悉Objective-C上用代码构造UI的前提下写的官方教程:https://developer.apple.com/tutorials/swiftui/creating-and-combining-views*使用的一些......
  • jmeter,常见的几种上下文关联方法
    ......
  • antd TextArea placeholder文案换行的几种方式
    constApp=()=>{constvalue=`例子:\n今天天气不错`;constvalue1=`例子:\r今天天气不错`;return(<><TextAreaplaceholder="例子:&#......
  • 几种常见的React Hooks
    useStateuseState,让函数组件拥有了维持状态的功能。维持状态是指在函数的多次渲染之间,这个state是可以在函数中间共享的使用方式importReact,{useState}from'reac......
  • laravel redirect几种用法
    1.使用Facdes的方式//重定向路由returnRedirect::to('/home');//重定向命名路由returnRedirect::route('website.home');//重定向到控制器动作returnRedirect::action('......
  • 1、Spring事务失效的几种原因
    Spring事务失效的几种原因1、Bean没有被Spring管理,即类上没有加入@Service、@Component等注解。2、方法没有使用public修饰加@Transactional注解的方法必须用public关键......
  • 几种元素定位错误的记录
    使用testNG+pageObject有时候会遇到的几种元素定位的错误1、elementisnotattachedtothepagedocument使用pageObject模式元素都是提前定位好的,有时页面多次操作会......
  • 转载:不一样的入门:看C# Hello World的17种写法
    https://www.cnblogs.com/jara/p/3456672.html 摘要:本文针对不同阶段、不同程度的C#学习者,介绍了C#HelloWorld的17种不同写法,希望会对大家有所帮助。(C#HelloWorld......