简介:

多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生.

死锁案例:

结果:
最终卡在这了。

  1. package test;
  2. /**
  3. * 模拟线程死锁
  4. */
  5. public class Main {
  6. public static void main(String[] args) {
  7. //模拟死锁现象
  8. DeadLockDemo A = new DeadLockDemo(true);
  9. A.setName("A线程");
  10. DeadLockDemo B = new DeadLockDemo(false);
  11. B.setName("B线程");
  12. A.start();
  13. B.start();
  14. }
  15. }
  16. //线程
  17. class DeadLockDemo extends Thread {
  18. static Object o1 = new Object();// 保证多线程,共享一个对象,这里使用static
  19. static Object o2 = new Object();
  20. boolean flag;
  21. public DeadLockDemo(boolean flag) {//构造器
  22. this.flag = flag;
  23. }
  24. @Override
  25. public void run() {
  26. //下面业务逻辑的分析
  27. //1. 如果flag 为 T, 线程A 就会先得到/持有 o1 对象锁, 然后尝试去获取 o2 对象锁
  28. //2. 如果线程A 得不到 o2 对象锁,就会Blocked
  29. //3. 如果flag 为 F, 线程B 就会先得到/持有 o2 对象锁, 然后尝试去获取 o1 对象锁
  30. //4. 如果线程B 得不到 o1 对象锁,就会Blocked
  31. if (flag) {
  32. synchronized (o1) {//对象互斥锁, 下面就是同步代码
  33. System.out.println(Thread.currentThread().getName() + " 进入1");
  34. synchronized (o2) { // 这里获得li对象的监视权
  35. System.out.println(Thread.currentThread().getName() + " 进入2");
  36. }
  37. }
  38. } else {
  39. synchronized (o2) {
  40. System.out.println(Thread.currentThread().getName() + " 进入3");
  41. synchronized (o1) { // 这里获得li对象的监视权
  42. System.out.println(Thread.currentThread().getName() + " 进入4");
  43. }
  44. }
  45. }
  46. }
  47. }

image.png