概念


多个线程之间,由于针对多个对象进行上锁,导致多个线程之间相互等待对方释放对象的锁的过程

例:
死锁 - 图1

死锁的产生条件


1.互斥作用:针对同一个资源,提供了互斥的锁
2.不可剥夺:当一个线程占用了某个资源后,该资源不能被其他线程抢占
3.相互等待:两个线程互相等待对方释放资源

死锁的实例


  1. public class DeadLockTask implements Runnable {
  2. private static Object o1 = new Object();
  3. private static Object o2 = new Object();
  4. // 1-先锁o1 再锁o2 2-先锁o2 再锁o1
  5. private int flag;
  6. public DeadLockTask(int flag) {
  7. super();
  8. this.flag = flag;
  9. }
  10. @Override
  11. public void run() {
  12. // TODO Auto-generated method stub
  13. if (flag == 1) {
  14. synchronized (o1) {
  15. System.out.println(Thread.currentThread().getName() + "锁住了 o1");
  16. // 休眠1S
  17. try {
  18. Thread.sleep(1000);
  19. } catch (InterruptedException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. }
  23. // 试图去锁o2
  24. synchronized (o2) {
  25. System.out.println(Thread.currentThread().getName() + "锁住了 o2");
  26. }
  27. }
  28. } else {
  29. synchronized (o2) {
  30. System.out.println(Thread.currentThread().getName() + "锁住了 o2");
  31. // 休眠1S
  32. try {
  33. Thread.sleep(1000);
  34. } catch (InterruptedException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. // 试图去锁o1
  39. synchronized (o1) {
  40. System.out.println(Thread.currentThread().getName() + "锁住了 o1");
  41. }
  42. }
  43. }
  44. }
  45. }
  1. public class MainEnter {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. Thread t1 = new Thread(new DeadLockTask(1));
  5. Thread t2 = new Thread(new DeadLockTask(2));
  6. //开启t1 t2
  7. t1.start();
  8. t2.start();
  9. }
  10. }

死锁的解决


死锁的造成大多是因为代码设计不合理造成,只需要修改锁住部分的代码即可