@GetMapping(value = "/hello")
@ResponseBody
public String hello() {
//步骤一、获取一把锁,只要锁的名字一样,就是同一把锁
RLock lock = redisson.getLock("my-lock");
//步骤二【1】lock.lock(); 是阻塞式等待的,默认加锁时间是30s,默认情况下,看门狗的续期时间是30s,也可以通过修改Config.lockWatchdogTimeout来另行指定,如果业务超长,运行期间会自动续期到30s(不用担心业务时间长,锁自动过期被删掉;加锁的业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认会在30s内自动过期,不会产生死锁问题)
lock.lock();
//步骤二【2】10秒钟自动解锁,自己指定解锁时间redis不会自动续期(指定解锁时间带来的问题:如果业务执行的时间超过指定时间,redis会自动解锁;当前业务执行完后又要解锁,可能会解锁到另一条线程加的锁,所以自己指定的解锁时间一定大于业务执行的时间)
lock.lock(10,TimeUnit.SECONDS)
//步骤二【3】手动设置了过期时间,看门狗就不会自动续期,锁到达过期时间后,就释放了。
lock.tryLock(10, 20, TimeUnit.SECONDS);//没有Watch Dog ,20s后自动释放
//步骤二【4】默认-1,会将锁过期时间设置为30s,定时任务每隔10秒执行续锁操作
lock.tryLock(10, TimeUnit.SECONDS);// 具有Watch Dog 自动延期机制 默认续30s
//leaseTime 参数表示锁过期时间
try {
System.out.println("加锁成功,执行业务..." + Thread.currentThread().getId());
TimeUnit.SECONDS.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//3、解锁
System.out.println("释放锁..." + Thread.currentThread().getId());
lock.unlock();
}
return "hello";
}