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