[三]多线程编程-死锁

继 多线程编程-单例模式:http://www.cnblogs.com/wangfajun/p/6549870.html 介绍的单例模式后,我们接下来说下同步中的一个问题:死锁

什么是死锁?先来个程序例子:

public class Test {
    public static void main(String[] args) {
        new Thread(new DeadLock(true)).start();
        new Thread(new DeadLock(false)).start();
    }
}
/**
 * 锁对象
 */
class Lock{
    static Object one = new Object();
    static Object two = new Object();
}
class DeadLock implements Runnable{
    private boolean flag;
    DeadLock(boolean flag){
        this.flag = flag;
    }
    @Override
    public void run() {
        if(flag){
            synchronized (Lock.one) {
                System.out.println("if one");
                synchronized (Lock.two) {
                    System.out.println("if two");
                }
            }
        }else{
            synchronized (Lock.two) {
                System.out.println("else two");
                synchronized (Lock.one) {
                    System.out.println("else one");
                }
            }
        }
        
    }
}
执行结果:
  if one
  else two

假设上面的两个线程为A跟B,根据执行结果,首先A获得了Lock.one锁打印了if one,接下来A想要获得Lock.two,但是执行结果并没有打印if two,说明A并没有得到Lock.two,为什么?

你看执行结果的else two,说明B获得了Lock.two,A想要获取B获得的Lock.two,但是B不给,因为B也想要A拥有的Lock.one锁,但A也不给B,造成了死锁。。。

举个例子吧:吃饭了,我有一根筷子,你有一根筷子,我想要你的那根筷子吃上饭,你想要我的这根筷子吃上饭,我们都不给对方,那饭别吃了。。。

死锁就说到这里,明白否?

原文地址:https://www.cnblogs.com/wangfajun/p/6552904.html