Redission分布式锁lock和tryLock的区别

首先说一下程序中锁的概念,用生活的例子你可以这样去理解,如果同一时刻有张三和李四都要去wc,但是卫生间只有一个,怎么办,那只能是先抢到的先用。针对这个我们针对redission的分布式锁可以详细说说。

先说说lock.trylock(),这个是非阻塞获取锁方式,可以返回获锁结果,可根据结果决定业务的停留

情况1:

#如果张三先抢到了卫生间,那么李四头也不回的就走了
#看门狗说:张三没出来我不走
lock.tryLock();

情况2: 

#如果张三先抢到了卫生间,李四在这里等十秒,十秒钟张三没出来他就走
#看门狗说:张三没出来我不走
lock.tryLock(10, TimeUnit.SECONDS); 

情况3: 

#张三先抢到了卫生间,但他只有10秒钟的使用时间,李四说不急,他有耐心,他可以等100秒
#看门狗说:我这次不在
lock.tryLock(100, 10, TimeUnit.SECONDS);

lock.lock(),这个是阻塞获取锁方式,无法感知获锁结果,纯阻塞式等待

情况1:

#张三先抢到,李四跟他杠上了,我就在这等着,你完事我再上
#看门狗说:嗯,你们杠,我就在这帮张三看着,张三没出来我不走
lock.lock();

情况2:

#这次李四可能比较着急,他就等10秒,10秒之后张三没出来就走
#看门狗说:这次我不在,但是门也能锁10秒
lock.lock(10, TimeUnit.SECONDS);

 通过上面的这两种案例讲解,相信大家应该对redission的锁使用有了个明确的概念,看门狗机制默认是30s,如果业务没处理完,会自动续期的

看门狗续期步骤讲解:

1、在获取锁的时候,不能指定leaseTime或者只能将leaseTime设置为-1,这样才能开启看门狗机制。
2、在tryLockInnerAsync方法里尝试获取锁,如果获取锁成功调用scheduleExpirationRenewal执行看门狗机制
3、在scheduleExpirationRenewal中比较重要的方法就是renewExpiration,当线程第一次获取到锁(也就是不是重入的情况),那么就会调用renewExpiration方法开启看门狗机制。
在renewExpiration会为当前锁添加一个延迟任务task,这个延迟任务会在10s后执行,执行的任务就是将锁的有效期刷新为30s(这是看门狗机制的默认锁释放时间)
4、并且在任务最后还会继续递归调用renewExpiration。
 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值