乐观锁与悲观锁-Redisson-lock锁测验
原创1.简单应用(直接锁定,使用看门狗自动更新机制)
@ResponseBody
@GetMapping("/hello")
public String hello() {
//1,获取相同的锁,只要锁的名称是相同的锁,
RLock lock = redisson.getLock("my-lock");
//2、加锁
//阻塞等待,默认锁都是30秒
//1),锁的自动更新,如果业务很长,锁将在操作期间自动更新。30s,不用担心长时间工作,锁定会自动过期并被删除
//2)只要锁定的业务完成,就不会续订。即使未手动删除和解锁,锁也将默认30s稍后自动删除。
lock.lock();
try{
System.out.println("成功锁定、执行业务"+Thread.currentThread().getId());
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//3、解锁
System.out.println(Thread.currentThread().getId()+"释放锁");
lock.unlock();
}
return "hello";
}
看门狗机制:如果我们没有指定锁超时,请使用它。 30 * 1000
【看门狗lockWatchdogTimeout默认时间]]。只要锁被成功占用,就会启动定时任务[重置锁的过期时间,新的过期时间是看门狗的默认时间]],每隔10s自动续订、续订30s。
2.最佳解决方案(设置自己的超时,注意超时必须大于业务执行时间)
@ResponseBody
@GetMapping("/hello")
public String hello() {
//1,获取相同的锁,只要锁的名称是相同的锁,
RLock lock = redisson.getLock("my-lock");
//2、加锁
//10第二次自动解锁,自动解锁时间必须大于业务的执行时间
lock.lock(10, TimeUnit.SECONDS);
// 问题:锁定时间结束后,不会自动续订。
//如果我们通过了锁的超时,我们就发送它redis执行脚本并运行锁。默认超时是我们指定的时间。
//1) lock.lock(10, TimeUnit.SECONDS);保存整个续订操作并手动解锁。
try {
System.out.println("成功锁定、执行业务" + Thread.currentThread().getId());
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//3、解锁 假设解锁代码没有运行,redis会有死锁吗
System.out.println(Thread.currentThread().getId() + "释放锁");
lock.unlock();
}
return "hello";
}
}
使用自己指定过期时间:如果我们通过了锁的超时,我们就发送它redis执行脚本并运行锁。默认超时是我们指定的时间。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除