1、線程死鎖的概念:
簡單地理解下吧!
我們都知道,線程在執行的過程中是占着CPU的資源的,當多個線程都需要一個被鎖住的條件才能結束的時候,死鎖就產生了!
還有一個經典的死鎖現象:
經典的“哲學家就餐問題”,5個哲學家吃中餐,坐在圓卓子旁。每人有5根筷子(不是5雙),每兩個人中間放一根,哲學家時而思考,時而進餐。
每個人都需要一雙筷子才能吃到東西,吃完后將筷子放回原處繼續思考,如果每個人都立刻抓住自己左邊的筷子,然后等待右邊的筷子空出來,同時又不
放下已經拿到的筷子,這樣每個人都無法得到1雙筷子,無法吃飯都會餓死,這種情況就會產生死鎖:
每個人都擁有其他人需要的資源,同時又等待其他人擁有的資源,並且每個人在獲得所有需要的資源之前都不會放棄已經擁有的資源。
當多個線程完成功能需要同時獲取多個共享資源的時候可能會導致死鎖。
1:兩個任務以相反的順序申請兩個鎖,死鎖就可能出現
2:線程T1獲得鎖L1,線程T2獲得鎖L2,然后T1申請獲得鎖L2,同時T2申請獲得鎖L1,此時兩個線程將要永久阻塞,死鎖出現
如果一個類可能發生死鎖,那么並不意味着每次都會發生死鎖,只是表示有可能。要避免程序中出現死鎖。
3:要避免死鎖某個程序需要訪問兩個文件,當進程中的兩個線程分別各鎖住了一個文件,那它們都在等待對方解鎖另一個文件,而這永遠不會發生。
2、簡單舉例說明:
1 package cn.sxt.runnables; 2 /** 3 * 簡單的死鎖例子 4 * @author 小風微靈 5 * 6 */ 7 public class DeadLock extends Thread{ 8 9 10 public DeadLock(String name){ 11 super(name); 12 } 13 14 public void run() { 15 16 while(true){ 17 if("天使彥".equals(Thread.currentThread().getName())){ 18 /** 19 * 簡單初步地預防死鎖現象: 20 */ 21 try { 22 Thread.sleep(1000); 23 } catch (InterruptedException e) { 24 e.printStackTrace(); 25 } 26 27 synchronized ("遙控器") { 28 System.out.println("天使彥拿到遙控器,准備去拿電池!"); 29 synchronized ("電池") { 30 System.out.println("天使彥拿到遙控器和電池,吹着空調爽歪歪.....!"); 31 break; 32 } 33 } 34 35 36 }else if("葛小倫".equals(Thread.currentThread().getName())){ 37 synchronized ("電池") { 38 System.out.println("葛小倫拿到電池,准備去拿遙控器!"); 39 synchronized ("遙控器") { 40 System.out.println("葛小倫拿到遙控器和電池,吹着空調爽歪歪.....!"); 41 break; 42 } 43 } 44 45 } 46 } 47 } 48 public static void main(String[] args) { 49 50 DeadLock yan=new DeadLock("天使彥"); 51 yan.start(); 52 DeadLock gxl=new DeadLock("葛小倫"); 53 gxl.start(); 54 } 55 56 }