手写一个简单的死锁代码

手写一个简单的死锁代码

死锁原因

多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束。这是从网上其他文档看到的死锁产生的四个必要条件:

1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用

2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。

4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。

相关代码

  • 线程1
package org.yujuan.thread.deadlock;

/**
 * The type Lock 1.
 *
 * @author yujuan
 * @time 2019 /08/22 16:16:42
 */
class Lock1 implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("Lock1 running");
            while (true) {
                synchronized (DeadLock.obj1) {
                    System.out.println("Lock1 lock obj1");
                    Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
                    synchronized (DeadLock.obj2) {
                        System.out.println("Lock2 lock obj2");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • 线程2
package org.yujuan.thread.deadlock;

/**
 * The type Lock 2.
 *
 * @author yujuan
 * @time 2019 /08/22 16:19:38
 */
class Lock2 implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("Lock2 running");
            while (true) {
                synchronized (DeadLock.obj2) {
                    System.out.println("Lock2 lock obj2");
                    Thread.sleep(3000);
                    synchronized (DeadLock.obj1) {
                        System.out.println("Lock2 lock obj1");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • 主函数
package org.yujuan.thread.deadlock;


/**
 * The type Dead lock.
 *
 * @author yujuan
 * @time 2019 /08/22 16:16:42
 */
public class DeadLock {
    /**
     * The constant obj1.
     *
     */
    public static String obj1 = "obj1";
    /**
     * The constant obj2.
     */
    public static String obj2 = "obj2";

    /**
     * Main.
     *
     * @param args the args
     * @author yujuan
     * @time 2019 /08/22 16:16:42
     */
    public static void main(String[] args) {
        Thread a = new Thread(new Lock1());
        Thread b = new Thread(new Lock2());
        a.start();
        b.start();
    }
}

运行结果

运行结果

项目代码 Github

欢迎关注 个人博客

posted @ 2019-08-22 16:42  晚安,Jake  阅读(1393)  评论(0编辑  收藏  举报