本帖最后由 java4study 于 2014-09-29 23:45:40 编辑

解决方案 »

  1.   

    public class DeadLockDemo {
    public static void main(String[] args) {
    DeadLock dl = new DeadLock();
    DeadLock d2 = new DeadLock();
    dl.start();
    d2.start();
    }
    }
    继承Thread类启动线程时(如上代码new了2个DeadLock对象), dl.obj1和d2.obj1是不同的对象(测试时打印出obj1的引用地址可证),所以run()方法中锁对象完全不同,2个线程互相毫无影响;
    实现Runnable接口启动线程时,run()方法都是使用的同一个锁对象,所以会死锁;
      

  2.   

    class DeadLock implements Runnable{//为什么换成继承Thread类不会发生死锁~
    boolean flag = true;
    Object obj1 = new Object();
    Object obj2 = new Object();
    public void run(){
    while (true){
    if (flag){
    flag = false;
    synchronized (obj1){
    System.out.println(Thread.currentThread().getName()+"  true...out");
    synchronized (obj2){
    System.out.println(Thread.currentThread().getName()+"  true...in");
    }
    }
    }
    if (!flag){
    flag = true;
    synchronized (obj2){
    System.out.println(Thread.currentThread().getName()+"  false...out");
    synchronized (obj1){
    System.out.println(Thread.currentThread().getName()+"  false...in");
    }
    }
    }
    }
    }
    }
    class DeadLockDemo{
    public static void main(String[] args) 
    {
    DeadLock dl = new DeadLock();
    Thread t0 = new Thread(dl);
    Thread t1 = new Thread(dl);
    t0.start();
    t1.start();
    }
    }
      

  3.   

    这个回答是对的。你对线程还不熟。Thread和Runnable的区别还没理解。
      

  4.   

    一个DeadLock 共用一个flag变量自然死锁,2个线程对象各自有各自的flag变量自然不会死锁。
      

  5.   

    厉害,果然是这样的,我打印出四个hashCode了,本来应该是两个对象锁的,实现Runnable的时候,是调用回DeadLock的run所以是同一对象,是这个道理吧?