您好,登錄后才能下訂單哦!
本篇文章為大家展示了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中怎么避免程序死鎖,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。