java 中死鎖問題的實例詳解
在秀山土家族苗族等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網站制作、成都網站設計、外貿營銷網站建設 網站設計制作按需制作網站,公司網站建設,企業(yè)網站建設,品牌網站設計,營銷型網站,外貿網站建設,秀山土家族苗族網站建設費用合理。
先看代碼在做解釋
public class DeadLock implements Runnable{ String a; String b; boolean flag; public DeadLock(String a,String b,boolean flag){ this.a=a; this.b=b; this.flag=flag; } public void run(){ if(flag){ // while(true){ synchronized(a){ System.out.println("鎖a"); synchronized(b){ System.out.println("鎖b----"); } } // } }else{ // while(true){ synchronized(b){ System.out.println("鎖b"); synchronized(a){ System.out.println("鎖a----"); } } // } } } public static void main(String[] args){ String a=new String("a"); String b=new String("b"); DeadLock d1=new DeadLock(a,b,true); DeadLock d2=new DeadLock(a,b,false); Thread t1=new Thread(d1); Thread t2=new Thread(d2); t1.start(); t2.start(); System.out.println("歡聲笑語中打出GG"); } }
以上是代碼部分,如果沒有死鎖,可以在if下加while(true),必然死鎖,下面來做說明。
這個僅僅是為了理解死鎖和面試用的,創(chuàng)建兩個對象a和b只是為了作為死鎖的對象而用,線程t1運行(t1.start()),線程t1拿到鎖a后,需要繼續(xù)執(zhí)行,拿到鎖b,而線程t2運行(t2.start()),拿到鎖b,想繼續(xù)拿到鎖a繼續(xù)執(zhí)行,這就形成死鎖,互相持有對面所需要的鎖對象。
如果面試,可以簡單記下,兩個線程,兩個鎖對象,鎖互相嵌套,最少兩種狀態(tài),同時執(zhí)行,一次不行就多次,也可鎖外面加循環(huán),讓線程多次運行,就會死鎖,因為運行一次,可能存在偶然,第一個線程執(zhí)行完了,鎖對象釋放了,第二個線程才進來執(zhí)行,如此就有偶然現(xiàn)象。
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!