导致线程死锁原因是:线程同步嵌套,即线程1调用线程2,线程2调用线程1 。
所以要避免同步嵌套。
死锁例子:
/**
* 死锁出现情况是:一般是嵌套同步造成的。
* 死锁是线程a访问线程b里面的代码,而线程b则要访问线程a里面的代码,
* 线程a要访问b则要获得b的锁,b要访问a则要获得a的锁,这就造成了两个
* 线程互相等待,导致程序不动的结果。
*/
public class DeadLock4 {
public static void main(String[] args) {
ThreadDemo t1 = new ThreadDemo(true);
ThreadDemo t2 = new ThreadDemo(false);
t1.start();
t2.start();
}
}
class ThreadDemo extends Thread {
private boolean flag;
private static final Object OBJ1 = new Object();
private static final Object OBJ2 = new Object();
public ThreadDemo() {
}
public ThreadDemo(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if (flag) {
synchronized(ThreadDemo.OBJ1) {
System.out.println("if obj1");
synchronized(ThreadDemo.OBJ2) {
System.out.println("if obj2");
}
}
} else {
synchronized(ThreadDemo.OBJ2) {
System.out.println("else obj2");
synchronized(ThreadDemo.OBJ1) {
System.out.println("else obj1");
}
}
}
}
}