虽然第二个进程没有获取到锁,但是他也修改了锁的value

来源:14-3 分布式锁双重防死锁演进

chrishhdbx

2018-02-01


if(null != lockValue && System.currentTimeMillis() > Long.parseLong(lockValue)){
    //    LINE A
    String getSetResult = RedisShardedPoolUtils.getSet(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK,
            String.valueOf(System.currentTimeMillis() + locktime));
    if(getSetResult == null || (getSetResult != null
            && StringUtils.equals(getSetResult,lockValue)) ){ 
        closeOrder(Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
    }else{
        log.info("没有获取到分布式锁V3{}" , Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
    }
}else{
    log.info("没有获取到分布式锁V3{}" , Const.REDIS_LOCK.CLOSE_ORDER_TASK_LOCK);
}

如果同时有两个tomcat 都进入到了 Line A

其中有一个tomcat已经执行结束

第二个tomcat在执行的时候  又 getset了锁的value

虽然第二个进程没有获取到锁,但是他也修改了锁的value

请问这个影响大吗?

写回答

2回答

sakura65

2018-04-23

你说的问题是的的确确存在的,虽然只有一个线程能够执行业务代码,但是getSet方法却可能被多个线程执行,也就是其他线程修改了锁的超时时间,参考文章:https://www.cnblogs.com/linjiqin/p/8003838.html

0
0

Geely

2018-02-04

你好,同学,首先要看linea上边的逻辑,上边是要set一个值的,肯定是有一个

//img.mukewang.com/szimg/5a770e97000107de13580663.jpg

如图红色部分,也就是只有同时进入else的时候,才会发生你说的情况,而setnx肯定是会有一个进入if。假设我们是10台,1进入了if,9个都进入了else。那么在

if(getSetResult == null || (getSetResult != null && StringUtils.equals(lockValueStr,getSetResult))){

这一行的时候还会过滤掉不符合规范的,因为上边还有一个getset方法。

所以这个不用担心~

0
0

Java企业级电商项目架构 Tomcat集群与Redis分布式

Tomcat集群+Redis分布式+代码重构+源码原理解析

2689 学习 · 947 问题

查看课程