虽然我们在编程的时候极力避免产生死锁,但是由于客观因素的存在我们很难保证百分百不发生死锁。所以如果发生了死锁我们应该采取适当的措施,让相互等待的双方或多方在等待一定时间无果后释放掉所占有的资源重新去竞争,防止死锁一直持续下去。
我们先来看看Java中什么情况下会释放锁
- 对于synchronized执行完同步方法或者代码块,就会释放锁。对于Lock,正常执行到unlock方法就会释放锁
- 对于synchronized在执行同步方法或者代码块的过程中,遇到异常而导致线程终止,锁也会被释放。但是对于Lock遇到异常并不会释放锁,所以必须在finally代码块中手动释放锁
- 对于synchronized在执行同步方法或者代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放锁,进入对象的等待池。
4.对于Lock ,在执行同步方法或者代码块的过程中,执行了锁所属对象的await()方法,这个线程会释放锁。
PS:在下面情况下,线程是不会释放锁的:
- 调用Thread.sleep()方法,当前线程放弃CPU,开始睡眠,在睡眠中不会释放锁*
- 调用Thread.yield()方法,当前线程放弃CPU,但不会释放锁(官方已警告不要使用此方法)
- 调用当前线程对象的suspend()方法,当前线程被暂停,但不会释放锁(官方已警告不要使用此方法)
网友评论