概念
多个线程之间,由于针对多个对象进行上锁,导致多个线程之间相互等待对方释放对象的锁的过程
例:
死锁的产生条件
1.互斥作用:针对同一个资源,提供了互斥的锁
2.不可剥夺:当一个线程占用了某个资源后,该资源不能被其他线程抢占
3.相互等待:两个线程互相等待对方释放资源
死锁的实例
public class DeadLockTask implements Runnable {private static Object o1 = new Object();private static Object o2 = new Object();// 1-先锁o1 再锁o2 2-先锁o2 再锁o1private int flag;public DeadLockTask(int flag) {super();this.flag = flag;}@Overridepublic void run() {// TODO Auto-generated method stubif (flag == 1) {synchronized (o1) {System.out.println(Thread.currentThread().getName() + "锁住了 o1");// 休眠1Stry {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 试图去锁o2synchronized (o2) {System.out.println(Thread.currentThread().getName() + "锁住了 o2");}}} else {synchronized (o2) {System.out.println(Thread.currentThread().getName() + "锁住了 o2");// 休眠1Stry {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 试图去锁o1synchronized (o1) {System.out.println(Thread.currentThread().getName() + "锁住了 o1");}}}}}
public class MainEnter {public static void main(String[] args) {// TODO Auto-generated method stubThread t1 = new Thread(new DeadLockTask(1));Thread t2 = new Thread(new DeadLockTask(2));//开启t1 t2t1.start();t2.start();}}
死锁的解决
死锁的造成大多是因为代码设计不合理造成,只需要修改锁住部分的代码即可
