亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中怎么避免程序死鎖

發布時間:2021-07-24 15:45:10 來源:億速云 閱讀:166 作者:Leah 欄目:編程語言

本篇文章為大家展示了java中怎么避免程序死鎖,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

  死鎖發生的條件

  互斥,共享資源只能被一個線程占用

  占有且等待,線程 t1 已經取得共享資源 s1,嘗試獲取共享資源 s2 的時候,不釋放共享資源 s1

  不可搶占,其他線程不能強行搶占線程 t1 占有的資源 s1

  循環等待,線程 t1 等待線程 t2 占有的資源,線程 t2 等待線程 t1 占有的資源

  避免死鎖的方法

  對于以上 4 個條件,只要破壞其中一個條件,就可以避免死鎖的發生。

  對于第一個條件 "互斥" 是不能破壞的,因為加鎖就是為了保證互斥。

  其他三個條件,我們可以嘗試

  一次性申請所有的資源,破壞 "占有且等待" 條件

  占有部分資源的線程進一步申請其他資源時,如果申請不到,主動釋放它占有的資源,破壞 "不可搶占" 條件

  按序申請資源,破壞 "循環等待" 條件

  使用管理類一次性申請所有的資源,破壞 "占有且等待" 條件示例

  package constxiong.concurrency.a023;

  import java.util.HashSet;

  import java.util.Set;

  /**

  * 測試 一次性申請所有的資源,破壞 "占有且等待" 條件示例

  * @author ConstXiong

  * @date 2019-09-24 14:04:12

  */

  public class TestBreakLockAndWait {

  //單例的資源管理類

  private final static Manger manager = new Manger();

  //資源1

  private static Object res1 = new Object();

  //資源2

  private static Object res2 = new Object();

  public static void main(String[] args) {

  new Thread(() -> {

  boolean applySuccess = false;

  while (!applySuccess) {

  //向管理類,申請res1和res2,申請失敗,重試

  applySuccess = manager.applyResources(res1, res2);

  if (applySuccess) {

  try {

  System.out.println("線程:" + Thread.currentThread().getName() + " 申請 res1、res2 資源成功");

  synchronized (res1) {

  System.out.println("線程:" + Thread.currentThread().getName() + " 獲取到 res1 資源的鎖");

  //休眠 1秒

  try {

  Thread.sleep(1000);

  } catch (Exception e) {

  e.printStackTrace();

  }

  synchronized (res2) {

  System.out.println("線程:" + Thread.currentThread().getName() + " 獲取到 res2 資源的鎖");

  }

  }

  } finally {

  manager.returnResources(res1, res2);//歸還資源

  }

  } else {

  System.out.println("線程:" + Thread.currentThread().getName() + " 申請 res1、res2 資源失敗");

  //申請失敗休眠 200 毫秒后重試

  try {

  Thread.sleep(200);

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  }).start();

  new Thread(() -> {

  boolean applySuccess = false;

  while (!applySuccess) {

  //向管理類,申請res1和res2,申請失敗,重試

  applySuccess = manager.applyResources(res1, res2);

  if (applySuccess) {

  try {無錫婦科醫院哪家好 http://www.xasgfk.cn/

  System.out.println("線程:" + Thread.currentThread().getName() + " 申請 res1、res2 資源成功");

  synchronized (res2) {

  System.out.println("線程:" + Thread.currentThread().getName() + " 獲取到 res1 資源的鎖");

  //休眠 1秒

  try {

  Thread.sleep(1000);

  } catch (Exception e) {

  e.printStackTrace();

  }

  synchronized (res1) {

  System.out.println("線程:" + Thread.currentThread().getName() + " 獲取到 res2 資源的鎖");

  }

  }

  } finally {

  manager.returnResources(res1, res2);//歸還資源

  }

  } else {

  System.out.println("線程:" + Thread.currentThread().getName() + " 申請 res1、res2 資源失敗");

  //申請失敗休眠 200 毫秒后重試

  try {

  Thread.sleep(200);

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  }

  }).start();

  }

  }

  /**

  * 資源申請、歸還管理類

  * @author ConstXiong

  * @date 2019-09-24 14:10:57

  */

  class Manger {

  //資源存放集合

  private Set

上述內容就是java中怎么避免程序死鎖,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌拉特中旗| 永靖县| 鸡西市| 商河县| 洪江市| 靖宇县| 大荔县| 新竹县| 蒲江县| 互助| 惠州市| 青田县| 张北县| 辽宁省| 隆尧县| 平和县| 阿拉善右旗| 波密县| 腾冲县| 仁怀市| 石景山区| 泽普县| 顺义区| 广丰县| 邯郸市| 志丹县| 宜兴市| 桃源县| 酒泉市| 巴东县| 榆中县| 新干县| 石棉县| 万载县| 汨罗市| 辰溪县| 贡嘎县| 伊宁县| 盐津县| 萨迦县| 景东|