@GetMapping("/hello")
public String testRedissonClient(){
//根据名字获取锁 只要锁名一样 就是同一把锁 第一个线程拿到这个锁 加锁 第二个线程拿到的就是 一个正在运行的加了锁的锁
RLock mylock = redissonClient.getLock("my-lock");
//加锁 redisson 加的锁会自动给锁设置一个30秒的过期时间TTL 避免没有执行解锁代码造成的死锁
//mylock.lock();//这个方法是一个阻塞式等待方法 如果拿不到锁一直在这里等待
mylock.lock(10, TimeUnit.SECONDS);
/**
* 注意 如果给锁设置过期时间10秒 业务执行需要30秒 业务还没执行完锁就会被释放 不会自动续期
* 所以 给锁设置的自动过期时间必须大于业务执行的时间
*
* 那我感觉还是不设置锁的自动过期时间 比较好 我又不知道这个业务到底要执行多久 网速快网速慢也有影响
* 反正 不设置锁的过期时间 业务没执行完锁自动续期 业务执行完了不续期锁也就过期了
*
* 但是老师说实战还是要显式的设置 锁的自动过期时间 设长一点就行
*
* 源码:
* 设置自动过期时间 lock()方法里 发送给redis脚本 进行占锁
* 如果没设置自动过期时间 只要占锁成功就会启动一个定时任务 定时续期 续的时间就是看门狗时间
*/
try{
//1.如果业务超长 redisson会自动给锁续期 续成还有30秒过期 看门狗机制 避免业务还没执行完锁就自动过期
//2.加锁的业务只要运行完成,就不会给当前锁续期 即使不手动解锁 锁也会在30秒后过期
System.out.println("加锁成功,执行业务代码。。。。"+Thread.currentThread().getId());
Thread.sleep(30000);
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("释放锁。。。。"+Thread.currentThread().getId());
mylock.unlock();
}
return "hello";
}
Redisson普通锁
最新推荐文章于 2023-10-22 11:36:42 发布