多线程 —— 死锁代码展示

死锁的意思其实就是相互等待。一个生活中的简单例子:我们去包子铺吃包子。

客户坚持:先吃包子,后付钱。
卖家坚持:先付钱以后,才能吃包子。

两边如果都坚持自己的原则,对于客户买包子,卖家卖包子赚钱这件事都阻塞在这里了,相持不下,就好像程序“死”在那里一样。

首先创建两把锁。

/**
 * Created by liwei on 16/7/18.
 *
 * 测试流程:测试死锁现象
 *
 */
public class MyLock {

    // 创建两把锁对象
    public static final Object objA = new Object();
    public static final Object objB = new Object();

}

竞争资源:

/**
 * Created by liwei on 16/7/18.
 */
public class DieLock extends Thread {

    // 设置一个旗标,控制线程的执行与停止
    private Boolean flag;

    public DieLock(Boolean flag){
        this.flag = flag;
    }

    @Override
    public void run(){
        if(flag){
            synchronized (MyLock.objA){
                System.out.println("if A");
                synchronized (MyLock.objB){
                    System.out.println("if B");
                }
            }
        }else {
            synchronized (MyLock.objB){
                System.out.println("else B");
                synchronized (MyLock.objA){
                    System.out.println("else A");
                }
            }
        }
    }
}

测试代码:

/**
 * Created by liwei on 16/7/18.
 */
/*
 * 同步的弊端:
 *      A:效率低
 *      B:容易产生死锁
 *
 * 死锁:
 *      两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象。
 *
 * 举例:
 *      中国人,美国人吃饭案例。
 *      正常情况:
 *          中国人:筷子两支
 *          美国人:刀和叉
 *      现在:
 *          中国人:筷子1支,刀一把
 *          美国人:筷子1支,叉一把
 */
public class DieLockDemo {

    // 深入分析一下死锁产生的原因
    // 听一下别人是怎么分析这个问题的
    public static void main(String[] args) {
        DieLock dl1 = new DieLock(true);
        DieLock dl2 = new DieLock(false);
        dl1.start();
        dl2.start();
    }
}

你可能感兴趣的:(多线程 —— 死锁代码展示)