Nis*_*ant 0 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");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道当两个或多个线程被阻塞等待彼此时会发生死锁.如何使用上面的代码实现相同的功能?同步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);
}
Run Code Online (Sandbox Code Playgroud)
您可能还必须删除这些System.out.println(...)调用,因为它们synchronized也会改变程序的时间并且可能使得更难以实现死锁.如果没有输出,要在没有输出的情况下检测死锁,可以使用jconsole附加到进程,查看Threads选项卡,然后单击"Detect Deadlock".您还可以观看程序的负载.当2个线程旋转时它应该是~200%,然后在它们被锁定时变为0.