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

Nis*_*ant 0 java multithreading

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*ray 5

如何使用上面的代码实现相同的功能?同步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);
}
Run Code Online (Sandbox Code Playgroud)

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