public class TestDeadLock implements Runnable {
public int t;
static Object o1=new Object();
static Object o2=new Object();
public static void main(String[] args) {
TestDeadLock d1 = new TestDeadLock();
TestDeadLock d2 = new TestDeadLock();
d1.t=0;
d2.t=1;
Thread t1 = new Thread(d1);
Thread t2= new Thread(d2);
t1.start();
t2.start();
} public void run() {
System.out.println(t);
if(t==1){
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(o2){
System.out.println("1");
}
}
if(t==0){
synchronized (o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(o1){
System.out.println("0");
}
}
}}以上代码我运行,未造成死锁,不知道是哪点出了毛病,高手进来看下!!!

解决方案 »

  1.   

    一个睡的时间长点,另一个短一点.
    睡的长一点的先启动,main线程小睡一点,等先启动的那个线程锁住一下O,再启动第二个线程.让第二个线线程锁住第二个O
      

  2.   

    t1.start();
    t2.start();
    改为:
    t1.start();
    Theard.sleep(100);
    t2.start();
    这样试试吧.
      

  3.   

    无论你怎么调先后,应该都不会死锁。因为A拿一个球a, B拿一个球b,不管谁先丢出球,就会解锁。关键要让他丢不出球。而这个程序没有这个限制。
      

  4.   

    楼主试下这个public class TestDeadLock implements Runnable {
    public int t;
    static Object o1 = new Object();
    static Object o2 = new Object(); public static void main(String[] args) {
    TestDeadLock d1 = new TestDeadLock();
    TestDeadLock d2 = new TestDeadLock();
    d1.t = 0;
    d2.t = 1;
    Thread t1 = new Thread(d1);
    Thread t2 = new Thread(d2);
    t1.start();
    t2.start();
    } public void run() {
    System.out.println(t);
    if (t == 1) {
    synchronized (o1) {
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } synchronized (o2) {
    System.out.println("1");
    }
    }
    }
    if (t == 0) {
    synchronized (o2) {
    try {
    Thread.sleep(500);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } synchronized (o1) {
    System.out.println("0");
    }
    }
    }
    }}主要是因为当一个线程锁住一个资源时,最好不要让它在锁住一个资源,如果两个线程相互锁住了对方需要的资源,这样就容易出现死锁的现象!
      

  5.   

    public class TestDeadLock implements Runnable {
        public int t;
        static Object o1=new Object();
        static Object o2=new Object();
        public static void main(String[] args) {
            TestDeadLock d1 = new TestDeadLock();
            TestDeadLock d2 = new TestDeadLock();
            d1.t=0;
            d2.t=1;
            Thread t1 = new Thread(d1);
            Thread t2= new Thread(d2);
            t1.start();
            try{
                 Thread.sleep(200);
            }catch(Exception e){
                e.printStackTrace();
            }
            t2.start();
        }    public void run() {
            System.out.println(t);
            if(t==0){
                synchronized (o1) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                
                synchronized(o2){
                    System.out.println("1");
                }}
            }else{
                synchronized (o2) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                
                synchronized(o1){
                    System.out.println("0");
                }}
            }    
        }}
      

  6.   

    public class Test{    public static void main(String[] args) {
            Class1 objClass1=new Class1();
            Class2 objClass2=new Class2();
         Thread1 objThread1=new Thread1(objClass1,objClass2);
         Thread2 objThread2=new Thread2(objClass1,objClass2);
         objThread1.start();
         objThread2.start();
        }
      
    }
    class Thread1 extends Thread{
    private Class1 obj1;
    private Class2 obj2;

    public Thread1(Class1 obj1, Class2 obj2) {
    super();
    this.obj1 = obj1;
    this.obj2 = obj2;
    } public void run(){
    synchronized(obj1){
    try{
    sleep(500);
    }catch(Exception e){
    e.printStackTrace();
    }
    obj2.method();
    obj1.method();
    }
    }
    }
    class Thread2 extends Thread{
    private Class1 obj1;
    private Class2 obj2;

    public Thread2(Class1 obj1, Class2 obj2) {
    super();
    this.obj1 = obj1;
    this.obj2 = obj2;
    } public void run(){
    synchronized(obj2){
    try{
    sleep(500);
    }catch(Exception e){
    e.printStackTrace();
    }
    obj1.method();
    obj2.method();
    }
    }
    }
    class Class1{
    synchronized public void method(){
    for(int i=0;i<5;i++){
        System.out.println("调用第一个对象的方法");
    }
    System.out.println("*********************************************end");
    }
    }
    class Class2{
    synchronized public void method(){
    for(int i=0;i<5;i++){
        System.out.println("调用第二个对象的方法");
    }
    System.out.println("*********************************************end");
    }
    }我也写一个
      

  7.   

    原因找到了, 对于t1锁住o1后,不能放开o1再锁o2,应该锁着o1同时再试图锁o2.
    对于t2也一样.这样才能死锁.