黑马程序员技术交流社区

标题: 死锁的例子和解析 [打印本页]

作者: 新晋猿工    时间: 2016-5-29 22:16
标题: 死锁的例子和解析

下面是一个死锁的例子:
当第一个线程类的参数为true时,走run方法,接着要2把锁才能走完,另外,另一个线程类也可以走完。但是,这只是个别情况,大多数情况下,程序都是未能走完的,因为当第一个线程类走到第一把锁(假如是objA)的时候,这时候可能第二个线程类抢到CPU执行权,接着走run方法,而这时候第一个线程类走完第一把锁的钥匙((objA),在等第二把锁的钥匙((objB),但是另外一个线程类也是走了第一把锁的钥匙(objB),在等第二把锁的钥匙(objA),这个时候出现了相互等待的现象,这就叫死锁。
下面是一个简单的死锁小例子:
public class DieLockDemo {
    public static void main(String[] args) {
        DieLock d1 = new DieLock(true);
        DieLock d2 = new DieLock(false);

        d1.start();
        d2.start();
       
    }
}

class DieLock extends Thread {

    private boolean flag;
    //注意,这里要注意,锁一旦确定就是不变的,所以要用static
    private static Object objA = new Object();
    private static Object objB = new Object();

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

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

作者: static小白    时间: 2016-5-29 22:33
顶贴是一种美德
作者: nanliner    时间: 2016-5-30 00:11
分享是一种快乐
作者: 哦哈哟    时间: 2016-5-30 01:21
请问怎么解这个锁呢?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2