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

标签 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");
    }
}

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

最佳答案

How do I implement the same using the code above? Synchronizing the methods in classes A and B doesn't help.

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

您将无法使用单个线程调用来模拟它,因为启动的第一个线程可能会在第二个线程启动之前完成。这是一个ace condition线程是否会陷入死锁。

您需要在两个线程中循环并一遍又一遍地尝试双锁。像下面这样的东西应该有效。在某些时候您会看到输出停止。

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(...) 调用,因为它们也是同步,这会改变程序的计时,并且可能使陷入僵局变得更加困难。如果没有输出,要在没有输出的情况下检测死锁,您可以使用 jconsole 附加到进程,查看“线程”选项卡,然后单击“检测死锁”。您还可以查看程序的负载。当 2 个线程旋转时,它应该约为 200%,然后当它们死锁时变为 0。

关于java - 如何使用这两个线程和A类和B类的对象来创建死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16223504/

相关文章:

java - 为什么我的 Java JDBC 到 Firebird 数据库的连接不会断开?

java - 纯java模块中的StringDef?

java - 多态性 - 重载/覆盖

java - 我必须将类扩展到 ConcurrentHashMap 还是我可以为 threadSafety 使用变量 ConcurrentHashMap

ios - requiresMainQueueSetup 和 dispatch_get_main_queue 的区别?

node.js - 在 Node 上加载

multithreading - 为什么线程本地存储这么慢?

android - Activity 线程结束后, Activity 没有停止

java - Firebase Java 管理 SDK 错误

java - 类加载器返回 NoSuchMethodException 错误