今天被同事问到了一个死锁的问题, 于是写了一个死锁的小程序,结果执行后发现无法形成死锁
package Thread;
/**
* 利用synchronized制造死锁
*/
public class DeadLock implements Runnable{
public int flag = 0;
/**
* 被锁对象一定要是静态的 用static修饰的, 如果不用static修饰
* 每个线程执行的时候都会创建一个各自的对象,锁的也就是各自的对象,不会死锁
* 如果对象被static修饰后,就是永远都是锁定这个对象,会形成死锁
*/
//static Object o1 = new Object(),o2 = new Object();
Object o1 = new Object(),o2 = new Object();
public void run(){
System.out.println(flag);
if(flag == 0){
synchronized (o1){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("t1=1");
}
}
}
if(flag == 1){
synchronized (o2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("t2=2");
}
}
}
}
public static void main(String[] args){
DeadLock dl1 = new DeadLock();
DeadLock dl2 = new DeadLock();
dl1.flag = 0;
dl2.flag = 1;
Thread td1 = new Thread(dl1);
Thread td2 = new Thread(dl2);
td1.start();
td2.start();
}
}
`
**问题原因见代码注释, 是不是恍然大悟!!!!**