溫馨提示×

溫馨提示×

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

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

java中怎么避免程序死鎖

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

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

  死鎖發(fā)生的條件

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

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

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

  循環(huán)等待,線程 t1 等待線程 t2 占有的資源,線程 t2 等待線程 t1 占有的資源

  避免死鎖的方法

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

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

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

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

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

  按序申請資源,破壞 "循環(huán)等待" 條件

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

  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 {無錫婦科醫(yī)院哪家好 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

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

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI