这是我参与 8 月更文挑战的第 14 天,活动详情查看: 8月更文挑战
1.什么是死锁
死锁是指两个或两个的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉,那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
2.死锁产生的原因
2.1 系统资源不足
2.2 进程运行推进的顺序不适合
2.3 资源分配不足
3.死锁的实例代码
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.println(Thread.currentThread().getName() + "\t持有" + lockA + ",想要获得" + lockB);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println(Thread.currentThread().getName() + "\t持有" + lockB + ",想要获得" + lockA);
}
}
}
}
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "A").start();
new Thread(new HoldLockThread(lockB, lockA), "B").start();
}
}
4.处理死锁的方法
4.1 预防死锁
这是一种较简单和直观的事先预防方法。该方法是通过设置某些限制条件,去破坏产生死锁四个必要条件的一个或几个来预防死锁。
4.2 避免死锁
同样是属于事先预防策略,但它并不是采取各种限制措施,去破坏死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。
4.3 检测死锁
允许进程在运行过程中发生死锁,但可以通过检测机构检测出死锁的发生,然后采取适当的措施,把进程从死锁状态中解脱出来。
4.4 解除死锁
当检测系统中已发生死锁,就采取相应的措施,将进程从死锁状态中解放出来。常用的方法是撤销一些进程,回收它们的资源,将它们分配给已处于阻塞状态的进程,使其能继续运行。