ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java中如何避免死锁呢? [打印本页]

作者: 科技颠覆者    时间: 2022-8-30 04:20
标题: Java中如何避免死锁呢?
转自:
 http://www.java265.com/JavaCourse/202204/3182.html
下文笔者讲述java中避免死锁的方法分享,如下所示
  1. 避免死锁的方法:
  2.     不使用synchronized这个显式的锁,而采用信号量控制资源,可被多少线程访问
  3.     当设置资源只可被一个线程访问时,则此时为锁住状态,
  4.         <a href="http://www.java265.com/JavaCourse/202204/3184.html" target="_blank" rel="noopener">信号量</a>可设置获取的超时时间,
  5.         对无法成功获取,可进行重复尝试,或指定尝试次数后,也可立即退出
复制代码
例:
使用信号量控制死锁
  1. package com.java265.other;
  2. import java.util.Date;
  3. import java.util.concurrent.Semaphore;
  4. import java.util.concurrent.TimeUnit;
  5. public class Test16 {
  6.         public static String obj1 = "java265.com-1";
  7.         public static final Semaphore a1 = new Semaphore(1);
  8.         public static String obj2 = "java265.com-2";
  9.         public static final Semaphore a2 = new Semaphore(1);
  10.         public static void main(String[] args) {
  11.                 LockAa a = new LockAa();
  12.                 new Thread(a).start();
  13.                 LockBb b = new LockBb();
  14.                 new Thread(b).start();
  15.         }
  16. }
  17. class LockAa implements Runnable {
  18.         public void run() {
  19.           try {
  20.                  System.out.println(new Date().toString() + " LockA 开始执行");
  21.                 while (true) {
  22.                  if (Test16.a1.tryAcquire(1, TimeUnit.SECONDS)) {
  23.                         System.out.println(new Date().toString() + " LockA 锁住 obj1");
  24.                           if (Test16.a2.tryAcquire(1, TimeUnit.SECONDS)) {
  25.                                 System.out.println(new Date().toString() + " LockA 锁住 obj2");
  26.                                 Thread.sleep(60 * 1000); // do something
  27.                           } else {
  28.                                 System.out.println(new Date().toString() + "LockA 锁 obj2 失败");
  29.                              }
  30.                  } else {
  31.                         System.out.println(new Date().toString() + "LockA 锁 obj1 失败");
  32.                 }
  33.                         Test16.a1.release(); // 释放
  34.                         Test16.a2.release();
  35.                         Thread.sleep(1000); // 马上进行尝试,现实情况下do something是不确定的
  36.                 }
  37.          } catch (Exception e) {
  38.                         e.printStackTrace();
  39.                 }
  40.         }
  41. }
  42. class LockBb implements Runnable {
  43.         public void run() {
  44.                 try {
  45.                         System.out.println("java265.com " + new Date().toString() + " LockB 开始执行");
  46.                         while (true) {
  47.                                 if (Test16.a2.tryAcquire(1, TimeUnit.SECONDS)) {
  48.                                         System.out.println(new Date().toString() + " LockB 锁住 obj2");
  49.                                         if (Test16.a1.tryAcquire(1, TimeUnit.SECONDS)) {
  50.                                                 System.out.println(new Date().toString() + " LockB 锁住 obj1");
  51.                                                 Thread.sleep(60 * 1000); // do something
  52.                                         } else {
  53.                                                 System.out.println(new Date().toString() + "LockB 锁 obj1 失败");
  54.                                         }
  55.                                 } else {
  56.                                         System.out.println(new Date().toString() + "LockB 锁 obj2 失败");
  57.                                 }
  58.                                 Test16.a1.release(); // 释放
  59.                                 Test16.a2.release();
  60.                                 Thread.sleep(10 * 1000);
  61.       // 这里只是为了演示,所以tryAcquire只用1秒,而且B要给A让出能执行的时间,否则两个永远是死锁
  62.                         }
  63.                 } catch (Exception e) {
  64.                         e.printStackTrace();
  65.                 }
  66.         }
  67. }
  68. -----运行以上代码,将输出以下信息-----
  69. Thu Apr 28 23:01:32 CST 2022 LockA 开始执行
  70. java265.com Thu Apr 28 23:01:32 CST 2022 LockB 开始执行
  71. Thu Apr 28 23:01:32 CST 2022 LockA 锁住 obj1
  72. Thu Apr 28 23:01:32 CST 2022 LockB 锁住 obj2
  73. Thu Apr 28 23:01:33 CST 2022LockB 锁 obj1 失败
  74. Thu Apr 28 23:01:33 CST 2022LockA 锁 obj2 失败
  75. Thu Apr 28 23:01:34 CST 2022 LockA 锁住 obj1
  76. Thu Apr 28 23:01:34 CST 2022 LockA 锁住 obj2
  77. Thu Apr 28 23:01:43 CST 2022 LockB 锁住 obj2
  78. Thu Apr 28 23:01:43 CST 2022 LockB 锁住 obj1
  79. Thu Apr 28 23:02:35 CST 2022 LockA 锁住 obj1
  80. Thu Apr 28 23:02:35 CST 2022 LockA 锁住 obj2
复制代码
版权声明


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4