虽然第二个进程没有获取到锁,但是他也修改了锁的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 00
- 
				  Geely 2018-02-04 你好,同学,首先要看linea上边的逻辑,上边是要set一个值的,肯定是有一个  如图红色部分,也就是只有同时进入else的时候,才会发生你说的情况,而setnx肯定是会有一个进入if。假设我们是10台,1进入了if,9个都进入了else。那么在 if(getSetResult == null || (getSetResult != null && StringUtils.equals(lockValueStr,getSetResult))){ 这一行的时候还会过滤掉不符合规范的,因为上边还有一个getset方法。 所以这个不用担心~ 00
相似问题
 
						 
						