死锁分析

非死锁
public class DeadLock extends Thread{

    Object o1 = new Object();
    Object o2 = new Object();
	int flag = 0;
	@Override
	public void run() {
		if(flag == 1){
			
			 synchronized (o1) {
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				synchronized (o2) {
					System.out.println("1");
				}
			}
		}
		
		if(flag == 0){
			
			 synchronized (o2) {
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				synchronized (o1) {
					System.out.println("0");
				}
			}
		}
	}
   
	public static void main(String[] args) {
	  DeadLock dl1 = new DeadLock();
	  dl1.flag = 1;
	  DeadLock dl2 = new DeadLock();
	  dl2.flag = 0;
	  dl1.start();
	  dl2.start();
	}
}


死锁
public class DeadLock extends Thread{

         static Object o1 = new Object();
	static Object o2 = new Object();
	int flag = 0;
	@Override
	public void run() {
		if(flag == 1){
			
			 synchronized (o1) {
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				synchronized (o2) {
					System.out.println("1");
				}
			}
		}
		
		if(flag == 0){
			
			 synchronized (o2) {
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				synchronized (o1) {
					System.out.println("0");
				}
			}
		}
	}
   
	public static void main(String[] args) {
	  DeadLock dl1 = new DeadLock();
	  dl1.flag = 1;
	  DeadLock dl2 = new DeadLock();
	  dl2.flag = 0;
	  dl1.start();
	  dl2.start();
	}
}

//第一个不是死锁,因为每次new一个DeadLock对象的时候,都会创建不同Object o1和o2对象,它们所锁住的对象不是同一个对象,故非死锁
//第二个是死锁,因为每次new一个DeadLock对象的时候,Object o1和o2对象是相同的,它们所锁住的对象是同一个对象,故死锁

你可能感兴趣的:(thread)