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

​一、背景

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

站在用户的角度思考问题,与客户深入沟通,找到普兰店网站设计与普兰店网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、成都网站设计、企业官网、英文网站、手机端网站、网站推广、域名与空间、雅安服务器托管、企业邮箱。业务覆盖普兰店地区。

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

简单解释一下:

  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();
}

到这里,似乎都理顺了。

三、新的思考

  • 阿里 Java 代码规范不允许用Execurots嘛?
  • 本文转载自微信公众号「架构染色」,可以通过以下二维码关注。转载本文请联系【架构染色】公众号作者。


    当前标题:自省:分布式锁主动续期的入门级实现
    网址分享:http://www.turtgq.com/article/dhihchh.html

    其他资讯