這篇文章主要介紹了Java模擬死鎖發生之演繹哲學家進餐問題的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
一 點睛
常見的死鎖形式:當線程1已經占據資源R1,并持有資源R1上的鎖,而且還在等待資源R2的鎖;而線程2已經占據資源R2,并且持有資源R2上的鎖,卻正在等待資源R1上的鎖。如果兩個線程不釋放自己占據的資源鎖,而且還申請對方資源上的鎖,申請不到時只能等待,而且它們只能永遠的等待下去。
二 實戰
1 代碼
public class DeadLockDemo { /** knife鎖 */ private static String knife = "餐刀"; //臨界資源 /** fork鎖 */ private static String fork = "叉子"; //臨界資源 public static void main(String[] args) { DaemonThread daemonTh = new DaemonThread(); Thread newDaemon = new Thread(daemonTh); newDaemon.setDaemon(true); newDaemon.start(); new DeadLockDemo().deadLock(); } private void deadLock() { Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (knife) { System.out.println(Thread.currentThread().getName() + "拿起了" + knife + ", 等待" + fork + "......"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (fork) { System.out.println(Thread.currentThread().getName() + "又拿起了" + fork + ",吃飯中..."); } } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (fork) { System.out.println(Thread.currentThread().getName() + "拿起了" + fork + ", 等待" + knife + "......"); synchronized (knife) { System.out.println(Thread.currentThread().getName() + "又拿起了" + knife + ",吃飯中..."); } } } }); t1.start(); t2.start(); } } class DaemonThread implements Runnable { @Override public void run() { while(true) { try { Thread.sleep(1000); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("守護線程:程序仍在運行中..."); } } }
2 運行
Thread-1拿起了餐刀, 等待叉子......
Thread-2拿起了叉子, 等待餐刀......
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
三 預防死鎖
1 解決方法
如果規定線程A和B都必須先拿刀,再拿叉,就不會發生死鎖。
2 代碼
public class DeadLockDemo { /** knife鎖 */ private static String knife = "餐刀"; //臨界資源 /** fork鎖 */ private static String fork = "叉子"; //臨界資源 public static void main(String[] args) { DaemonThread daemonTh = new DaemonThread(); Thread newDaemon = new Thread(daemonTh); newDaemon.setDaemon(true); newDaemon.start(); new DeadLockDemo().deadLock(); } private void deadLock() { Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (knife) { System.out.println(Thread.currentThread().getName() + "拿起了" + knife + ", 等待" + fork + "......"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (fork) { System.out.println(Thread.currentThread().getName() + "又拿起了" + fork + ",吃飯中..."); } } } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (knife) { System.out.println(Thread.currentThread().getName() + "拿起了" + knife + ", 等待" + fork + "......"); synchronized (fork) { System.out.println(Thread.currentThread().getName() + "又拿起了" + fork + ",吃飯中..."); } } } }); t1.start(); t2.start(); } } class DaemonThread implements Runnable { @Override public void run() { while(true) { try { Thread.sleep(1000); }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("守護線程:程序仍在運行中..."); } } }
3 運行
Thread-1拿起了餐刀, 等待叉子......
守護線程:程序仍在運行中...
守護線程:程序仍在運行中...
Thread-1又拿起了叉子,吃飯中...
Thread-2拿起了餐刀, 等待叉子......
Thread-2又拿起了叉子,吃飯中...
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java模擬死鎖發生之演繹哲學家進餐問題的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。