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/