<返回更多

分布式锁主动续期的入门级实现

2023-03-07  微信公众号  架构染色
加入收藏

一、背景

在《​​# 分布式锁上-初探​​》中有提到一个分布式锁应具备的功能特点中有避免死锁这一条:

如果某个客户端获得锁之后处理时间超过最大约定时间,或者持锁期间内发生了故障导致无法主动释放锁,其持有的锁也能够被其他机制正确释放,并保证后续其它客户端也能加锁,整个处理流程继续正常执行。

简单解释一下:

  1. 客户端抢到分布式锁之后开始执行任务,执行完毕后再释放分布式锁。
  2. 持锁后因客户端异常未能把锁释放,会导致锁成为永恒锁。
  3. 为了避免这种情况,在创建锁的时候给锁指定一个过期时间。
  4. 到期之后锁会被自动删除掉,这个角度看是对锁资源的一种保护。

二、理还乱?

逻辑看很简单,也很清晰,但任何事情都有两面性,自动删除自然有理,但肯定也有弊端。如果要把锁的功能做的健壮,总要从不断地自我质疑、自我反思中,理顺思路,寻找答案,我认为这属于自省式学习,以后也想尝试这种模式,一起来试试吧:

public void run() {
    while (true) {
        // 续租
        action.run();
    }
}
public void run() {
    while (true) {
        // 1、间隔
        TimeUnit.MILLISECONDS.sleep(sleepTime);
        // 2、续租
        action.run();
    }
}
public void run() {
    while (isRunning) {
        // 1、间隔
        TimeUnit.MILLISECONDS.sleep(sleepTime);
        // 2、续租
        action.run();
    }
}
private volatile boolean isRunning = true;

void cancel(){
    //控制线程退出
    this.isRunning = true;
}
void cancel(){
    //控制线程退出
    this.isRunning = true;
    //中断线程
    this.interrupt();
}

到这里,似乎都理顺了。

三、新的思考

 

 

图片

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>