Java最简单的死锁例子

骑猪看日落 2021-11-08 23:16 474阅读 0赞

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

简单来说:

  1. 线程1和线程2的执行逻辑中都需要锁定对象A和对象B。

  2. 线程1在执行中先锁定了A对象。

  3. 线程2在执行中锁定了B对象。

  4. 线程1需要锁定B对象时发现B对象已经被其他线程锁住,所以线程1需要等待B对象锁释放后继续执行。

  5. 线程2需要锁定A对象时发现A对象已经被其他线程锁住,所以线程2需要等待A对象锁释放后继续执行。

这样就产生了死锁现象,以下图展示了死锁:

20180406071514470

简单代码实现:

  1. package com.btt.test;
  2. public class DeadLock {
  3. private Object A = new Object();
  4. private Object B = new Object();
  5. public void run() {
  6. System.out.println("开始执行线程");
  7. }
  8. public Object getA() {
  9. return A;
  10. }
  11. public void setA(Object a) {
  12. A = a;
  13. }
  14. public Object getB() {
  15. return B;
  16. }
  17. public void setB(Object b) {
  18. B = b;
  19. }
  20. public static void main(String[] args) {
  21. final DeadLock dl1 = new DeadLock();
  22. Runnable r1 = new Runnable() {
  23. public void run() {
  24. synchronized (dl1.getA()) {
  25. String tName = Thread.currentThread().getName();
  26. System.out.println("我是线程" + tName + ",我拿到了A对象的锁");
  27. try {
  28. Thread.sleep(3000);
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. System.out.println("我需要拿B对象的锁啦");
  33. synchronized (dl1.getB()) {
  34. System.out.println("线程1开始跑了");
  35. }
  36. };
  37. }
  38. };
  39. Runnable r2 = new Runnable() {
  40. public void run() {
  41. synchronized (dl1.getB()) {
  42. String tName = Thread.currentThread().getName();
  43. System.out.println("我是线程" + tName + ",我拿到了B对象的锁");
  44. try {
  45. Thread.sleep(3000);
  46. } catch (InterruptedException e) {
  47. e.printStackTrace();
  48. }
  49. System.out.println("我需要拿A对象的锁啦");
  50. synchronized (dl1.getA()) {
  51. System.out.println("线程2开始跑了");
  52. };
  53. };
  54. }
  55. };
  56. Thread t1 = new Thread(r1);
  57. t1.setName("t1");
  58. t1.start();
  59. Thread t2 = new Thread(r2);
  60. t2.setName("t2");
  61. t2.start();
  62. }
  63. }

打印台输出结果:

  1. 我是线程t1,我拿到了A对象的锁
  2. 我是线程t2,我拿到了B对象的锁
  3. 我需要拿A对象的锁啦
  4. 我需要拿B对象的锁啦

发表评论

表情:
评论列表 (有 0 条评论,474人围观)

还没有评论,来说两句吧...

相关阅读

    相关 _Java产生简单案例

    一、简介 多个线程各自占有一些共享资源,并且互相等待其它线程占有的资源才能进行,而导致的两个或多个线程都在等待对方释放资源,都停止执行的情景。某一个同步块同时拥有“两个以

    相关 一个例子

    死锁: 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 死锁的四个必要条件:

    相关 Java简单例子

    死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。 简单来说: 1. 线程1和线程2的执行逻