分布式锁Redisson之闭锁
简介
闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:
1)确保某个计算在其需要的所有资源都被初始化之后才继续执行;
2)确保某个服务在其他依赖的所有其他服务都已经启动之后才启动;
3)等待直到某个操作所有参与者都准备就绪在继续执行。
案例
来看看它的应用场景案例,现在有五个班,你要等所有的班都走完才能放假。
/**
* 放假、锁门
* 1 班没人了
* 5个班,全部走完,我们才可以锁大门
* 分布式闭锁
*/
@GetMapping("/lockDoor")
@ResponseBody
public String lockDoor() throws InterruptedException {
RCountDownLatch door = redisson.getCountDownLatch("door");
door.trySetCount(5);
door.await();// 等待闭锁都完成
return "放假了";
}
@GetMapping("/gogogo/{id}")
@ResponseBody
public String go(@PathVariable Long id){
redisson.getCountDownLatch("door").countDown();//计数-1
return id + "班的人都走了";
}
这个await()
方法就是等到闭锁变为0, 我们先对/lockDoor发起请求,发现它会一直加载,因为它在等待同一把闭锁变为0,所以,这里我们要对第二个接口访问5次,来让它变为0.
当访问五次后,/lockDoor就加载出来了