标签:就是 方式 执行 lis 测试 red time 地方 start
之前的例子代码只是测试代码,只是为了说明原理,例子本身很简单,所以有一些考虑不周的地方。比如当获取到锁之后在业务操作执行过程中发生了环境问题导致断开了和Redis的连接,那就无法在finally块中释放锁,导致其他等待获取锁的线程无限等待下去,也就是发生了死锁现象。
解决方式:
可以在Redis中给锁设置一个过期时间,这样即便无法释放锁,锁也能在一段时间后自动释放。
代码上只需要在获取到锁之后在try语句块中加入如下代码:
jedis.expire(key, 10); //这里给锁设置10秒的过期时间
更妥善的解决方式:
第一个解决方式并不是很好,因为当业务操作处理时间很长,超过了设置的过期时间,那锁就自动释放了,然后再执行finally块中释放锁的操作时,这个锁可能已经被其他线程所持有,会导致把其他线程持有的锁给释放了,从而导致并发问题。所以更妥善一点的方式是在释放锁时判断一下锁是否已经过期,如果已经过期就不用再释放了。
代码上把获取到锁之后的操作改为如下代码:
long start = System.currentTimeMillis(http://www.my516.com); //获取起始时间毫秒数
try{
jedis.expire(key, 10);
...
}finally{
...
if(System.currentTimeMillis() < start+10*1000){
//如果之前设置的锁还未过期,则释放掉
jedis.del(key);
}
}
---------------------
标签:就是 方式 执行 lis 测试 red time 地方 start
原文地址:https://www.cnblogs.com/liyanyan665/p/11311289.html