操作系统——死锁

1.什么是死锁?

死锁就是多个进程或线程被阻塞,它们同时占用着对方所需的资源不放,僵持不下一直阻塞的情况。

2.说一下产生死锁的四个必要条件?

  1. 互斥:这个资源一次只有一个进程可以使用,比如锁。

  2. 占用并等待:一个进程至少应该占有一个资源并等待另一资源。

  3. 非抢占:资源不能被抢占,必须等待占用其的进程释放后,才能竞争。

  4. 循环等待:僵持不下,一直等待自己所需的资源。

3.Java代码模拟死锁

操作系统——死锁_第1张图片

public class DeadLockDemo {
    private static Object resource1 = new Object();//资源 1
    private static Object resource2 = new Object();//资源 2

    public static void main(String[] args) {
        new Thread(() -> {
            synchronized (resource1) {
                System.out.println(Thread.currentThread() + "get resource1");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource2");
                synchronized (resource2) {
                    System.out.println(Thread.currentThread() + "get resource2");
                }
            }
        }, "线程 1").start();

        new Thread(() -> {
            synchronized (resource2) {
                System.out.println(Thread.currentThread() + "get resource2");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get resource1");
                synchronized (resource1) {
                    System.out.println(Thread.currentThread() + "get resource1");
                }
            }
        }, "线程 2").start();
    }
}

 Thread[线程 1,5,main]get resource1
Thread[线程 2,5,main]get resource2
Thread[线程 1,5,main]waiting get resource2
Thread[线程 2,5,main]waiting get resource1

4.解决死锁的方法?

  • 预防:破坏四大必要条件之一即可,如静态资源分配方式,指一个线程必须在执行前就获取自己所需的全部资源,要么全部占有,要么不占有。

  • 避免:当一个进程申请使用资源时,先使用银行家算法进行试探分配,看是否处于安全状态,相当于提前做安全检查。

  • 检测:若进程资源分配图有环路,并且每一个资源类仅有一个资源,则系统中已经发生了死锁。

  • 解除:立即结束所有的进程执行,重启操作系统、逐个撤销涉及死锁的进程,回收资源直至死锁解除。

 

你可能感兴趣的:(操作系统,java,开发语言,linux,ubuntu,windows,macos,gnu)