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中的方法没有帮助。
我如何使用上面的代码实现相同的?同步类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将其附加到进程,查看Threads选项卡,然后单击"detect deadlock"。您还可以查看程序的加载情况。当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();
}