如何使用这两个线程和类A和B的对象创建死锁


public class DeadLock {
    public static void main(String[] args) {
        final A a = new A();
        final B b = new B();
        new Thread(new Runnable(){
            @Override
            public void run() {
                 a.aMethod(b);
                }
        },"Thread-2").start();
        new Thread(new Runnable(){
            @Override
            public void run() {
                b.bMethod(a);
            }
        },"Thread-2").start();
    }
}
class A {
    public  void aMethod(B b) {
        System.out.println("A method");
    }
}
class B {
    public  void bMethod(A a) {
        System.out.println("B method");
    }
}

我理解当两个或多个线程被阻塞等待对方时发生死锁。我如何使用上面的代码实现相同的?同步类A和类B中的方法没有帮助。

我如何使用上面的代码实现相同的?同步类A和类B中的方法没有帮助。

死锁的定义是:A被锁并且需要B的锁,同时B被锁并且需要A的锁。

你不能用一个线程调用来模拟它,因为很可能第一个启动的线程会在第二个线程启动之前结束。这是一个竞争条件,线程在竞争是否死锁。

您需要在两个线程中循环,并一次又一次地尝试双锁。像下面这样的东西应该可以工作。在某一时刻,您将看到输出停止。

public void run() {
   while (true) {
     a.aMethod(b);
   }
}
...
public void run() {
   while (true) {
     b.bMethod(a);
   }
}
...
public synchronized void aMethod(B b) {
    System.out.println("B method");
    b.bMethod(this);
}
...
public synchronized void aMethod(A a) {
    System.out.println("A method");
    a.aMethod(this);
}

您可能还必须删除System.out.println(...)调用,因为它们也是synchronized,这将改变您的程序的时间,并可能使它更难遇到死锁。如果没有输出,要在没有输出的情况下检测死锁,可以使用jconsole将其附加到进程,查看Threads选项卡,然后单击"detect deadlock"。您还可以查看程序的加载情况。当2个线程正在旋转时,它应该是~200%,当它们死锁时,它应该变为0。

public static void main(String[] args) {
    final Object a = new Object();
    final Object b = new Object();
    Thread t1 = new Thread() {
        @Override
        public void run() {
            synchronized (a) {
                try {
                    sleep(10000);
                } catch (InterruptedException exc) {
                    // 
                }
                synchronized (b) {
                    //
                }
            }
        }
    };
    Thread t2 = new Thread() {
        @Override
        public void run() {
            synchronized (b) {
                try {
                    sleep(10000);
                } catch (InterruptedException exc) {
                    // 
                }
                synchronized (a) {
                    //
                }
            }
        }
    };
    t1.start();
    t2.start();
}

最新更新