当两个线程互相等待对方的监视器时会发生死锁,所有线程处于阻塞状态,无法运行。在系统有多个监视器的情况下,死锁是很容易发生的。
class A {
public synchronized void foo(B b) {
System.out.println("Thread:" + Thread.currentThread().getName()
+ "run in foo() method of instance A");
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Thread:" + Thread.currentThread().getName()
+ "call last() of B class");
b.last();
}
public synchronized void last() {
System.out.println("last() of A...");
}
}
class B {
public synchronized void bar(A a) {
System.out.println("Thread:" + Thread.currentThread().getName()
+ "run in bar() method of instance B");
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Thread:" + Thread.currentThread().getName()
+ "call last() of A class");
a.last();
}
public synchronized void last() {
System.out.println("last() of B...");
}
}
public class DeadLock implements Runnable {
A a = new A();
B b = new B();
public void init() {
Thread.currentThread().setName("main Thread");
a.foo(b);
System.out.println("run in main Thread...");
}
@Override
public void run() {
Thread.currentThread().setName("dut Thread");
b.bar(a);
System.out.println("run in main Thread...");
}
public void main() {
DeadLock d = new DeadLock();
new Thread(d).start();
d.init();
}
}
京公网安备 11010502036488号