91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

南和县| 淮安市| 内黄县| 克拉玛依市| 武清区| 黑水县| 高安市| 贡山| 汤阴县| 碌曲县| 惠来县| 北辰区| 铜梁县| 轮台县| 白城市| 贺兰县| 磐安县| 松潘县| 余庆县| 米泉市| 两当县| 嘉峪关市| 麻阳| 炉霍县| 雅安市| 电白县| 钟山县| 休宁县| 黎城县| 柏乡县| 高尔夫| 武隆县| 芮城县| 涟源市| 锡林浩特市| 怀宁县| 台北市| 安义县| 富平县| 稷山县| 霍山县|