初级程序员必知系列之死锁略谈

106 阅读2分钟

这是我参与 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 解除死锁

当检测系统中已发生死锁,就采取相应的措施,将进程从死锁状态中解放出来。常用的方法是撤销一些进程,回收它们的资源,将它们分配给已处于阻塞状态的进程,使其能继续运行。