解决死锁问题

Posted liyanyan665

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决死锁问题相关的知识,希望对你有一定的参考价值。

之前的例子代码只是测试代码,只是为了说明原理,例子本身很简单,所以有一些考虑不周的地方。比如当获取到锁之后在业务操作执行过程中发生了环境问题导致断开了和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);


---------------------

以上是关于解决死锁问题的主要内容,如果未能解决你的问题,请参考以下文章

解决一次mysql死锁问题

SQLServer死锁的解除方法

MySQL - 死锁的产生及解决方案

一个多线程死锁案例,如何避免及解决死锁问题?

死锁的原因及解决方法 死锁的原因及解决办法

java 死锁