编写一个死锁程序

发布于:2023-01-11 ⋅ 阅读:(412) ⋅ 点赞:(0)

什么是死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,简单举个例子:

现有两个线程:线程A,线程B

两个LockLock1Lock2,分别作为同步代码块的锁

①线程A的同步代码块中优获取Lock1的对象锁,在睡眠一小段时间过后,获取Lock2对象锁

②线程B的同步代码块中优获取Lock2的对象锁,在睡眠一小段时间过后,获取Lock1对象锁

假设线程A获取到了Lock1对象锁,在经过短时间睡眠后(睡眠过程中线程B获取到了Lock2对象锁),线程A尝试获取Lock2对象锁时被阻塞了,这就形成了一个死锁

public class Test {
    public static void main(String[] args) throws InterruptedException {
        Object lock1 = new Object();
        Object lock2 = new Object();
​
        /**
         * 创建第一个线程
         */
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock1){
                    System.out.println("线程1拿到了锁");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
​
​
                    synchronized (lock2){
​
                        System.out.println("线程1的锁2");
                    }
​
                }
            }
        });
        t1.start();
        //t1.join();②设置锁的持有时间
​
        /**
         * 创建第二个线程
         */
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock2){//synchronized (lock1){线程获取锁的顺序一致
                    System.out.println("线程2拿到了锁");
​
​
                    synchronized (lock1){//synchronized (lock2){线程获取锁的顺序一致
                        System.out.println("线程2的锁1");
​
                    }
                }
            }
        });
        t2.start();
        //t2.join(1000);②种方式:设置锁的持有时间
    }
}

死锁产生的原因

互斥条件: 进程所访问到的资源不允许其他进程进行访问,若其他进程想要访问该资源,只能等到占用该资源 的进程使用完成后释放该资源才能访问

请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此 事请求阻塞,但又对自己获得的资源保持不放

不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放

循环等待条件:是指进程发生死锁后,必然存在一个进程–资源之间的环形链请求和保持条件:进程获得一定 的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但 又对自己获得的资源保持不放

处理死锁的方法

预防死锁:通过设置一些限制条件,去破坏产生死锁必要条件的一个或多个来预防死锁

避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁

检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉

解除死锁:当检测出死锁后,便采取适当措施将进程从死锁状态中解脱出来处理死锁的基本方法

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到