package deadLock; public class TestDeadLock implements Runnable { public int flag = 1; static Object o1 = new Object(),o2 = new Object(); public void run() { if (flag == 1)// 当flag==1锁住o1 { System.out.println("t1线程启动:锁住了o1并去睡觉"); synchronized (o1) { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println("t1线程醒来:发现o2已经被线程t2锁住,就一直等待着t2线程将o2的钥匙归还..."); //t1去使用o2,但是发现o2的锁已经被t2占用,所以出于等待状态 synchronized (o2)// 只要锁住o2就完成 { System.out.println("1"); } } } if (flag == 0)// 如果flag==0锁住o2 { System.out.println("t2线程启动:锁住了o2并去睡觉"); synchronized (o2) { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } System.out.println("t2线程醒来:发现o1被t1线程锁住了,就一直等待着t1线程将o1的钥匙归还..."); //t2去使用o1,但是o1的锁已经被t1占用,所以等待 synchronized (o1) { System.out.println("0"); } } } } public static void main(String[] args) { // 实例2个线程类 TestDeadLock td1 = new TestDeadLock(); TestDeadLock td2 = new TestDeadLock(); td1.flag = 1; td2.flag = 0; // 开启2个线程 Thread t1 = new Thread(td1); Thread t2 = new Thread(td2); t1.start(); t2.start(); //t1这个线程锁住了o1,t2就无法执行完成,因为t2锁住了o2,t1就无法执行完成 //死锁产生的条件:1,互斥条件 2,请求和保持条件 3,不剥夺条件 4,环路等待条件 //死锁解决方法:只要把其中一个条件解除了就能解决死锁 //能够发生死锁的两个必要条件是:synchronized,sleep. } }