A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 新晋猿工 中级黑马   /  2016-5-29 22:16  /  343 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


下面是一个死锁的例子:
当第一个线程类的参数为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");
                }
            }
        }
    }
}

3 个回复

倒序浏览
顶贴是一种美德
回复 使用道具 举报
分享是一种快乐
回复 使用道具 举报
请问怎么解这个锁呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马