如何使用这两个线程和类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"); } } 

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

如何使用上面的代码实现相同的function? 同步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将其附加到进程,请查看“线程”选项卡,然后单击“检测死锁”。 您还可以观看程序的负载。 当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(); }