- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java模擬死鎖發(fā)生之演繹哲學(xué)家進(jìn)餐問(wèn)題的示例分
這篇文章主要介紹了Java模擬死鎖發(fā)生之演繹哲學(xué)家進(jìn)餐問(wèn)題的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著(zhù)大家一起了解一下。
一 點(diǎn)睛
常見(jiàn)的死鎖形式:當線(xiàn)程1已經(jīng)占據資源R1,并持有資源R1上的鎖,而且還在等待資源R2的鎖;而線(xiàn)程2已經(jīng)占據資源R2,并且持有資源R2上的鎖,卻正在等待資源R1上的鎖。如果兩個(gè)線(xiàn)程不釋放自己占據的資源鎖,而且還申請對方資源上的鎖,申請不到時(shí)只能等待,而且它們只能永遠的等待下去。
二 實(shí)戰
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("守護線(xiàn)程:程序仍在運行中..."); } } }
2 運行
Thread-1拿起了餐刀, 等待叉子......
Thread-2拿起了叉子, 等待餐刀......
守護線(xiàn)程:程序仍在運行中...
守護線(xiàn)程:程序仍在運行中...
守護線(xiàn)程:程序仍在運行中...
守護線(xiàn)程:程序仍在運行中...
守護線(xiàn)程:程序仍在運行中...
三 預防死鎖
1 解決方法
如果規定線(xiàn)程A和B都必須先拿刀,再拿叉,就不會(huì )發(fā)生死鎖。
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("守護線(xiàn)程:程序仍在運行中..."); } } }
3 運行
Thread-1拿起了餐刀, 等待叉子......
守護線(xiàn)程:程序仍在運行中...
守護線(xiàn)程:程序仍在運行中...
Thread-1又拿起了叉子,吃飯中...
Thread-2拿起了餐刀, 等待叉子......
Thread-2又拿起了叉子,吃飯中...
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站