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

Java 如何使用这两个线程和类A和B的对象创建死锁?,java,multithreading,Java,Multithreading,我知道死锁发生在两个或多个线程被阻塞等待对方时。如何使用上面的代码实现相同的功能?同步类A和B中的方法没有帮助 如何使用上面的代码实现相同的功能?同步类A和B中的方法没有帮助 死锁的定义是A被锁定并需要B的锁,同时B被锁定并需要A的锁 您不能用单个线程调用来模拟它,因为启动的第一个线程可能会在第二个线程启动之前完成。这是一个r,其中线程是否竞相死锁 您需要在两个线程中循环,并反复尝试双锁。像下面这样的方法应该可以奏效。在某个时刻,您将看到输出停止 public class DeadLock {

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

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

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

您不能用单个线程调用来模拟它,因为启动的第一个线程可能会在第二个线程启动之前完成。这是一个r,其中线程是否竞相死锁

您需要在两个线程中循环,并反复尝试双锁。像下面这样的方法应该可以奏效。在某个时刻,您将看到输出停止

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");
    }
}
您可能还必须删除System.out.println。。。调用,因为它们也是同步的,这将改变程序的计时,并可能使死锁更难发生。如果没有输出,要在没有输出的情况下检测死锁,您可以使用jconsole附加到进程,请查看Threads选项卡,然后单击detect deadlock。你也可以观看你的节目。当两个线程旋转时,该值应为~200%,当它们死锁时,该值应为0

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);
}
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();
}