先看代碼在做解釋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
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),必然死鎖,下面來做說明。
這個(gè)僅僅是為了理解死鎖和面試用的,創(chuàng)建兩個(gè)對象a和b只是為了作為死鎖的對象而用,線程t1運(yùn)行(t1.start()),線程t1拿到鎖a后,需要繼續(xù)執(zhí)行,拿到鎖b,而線程t2運(yùn)行(t2.start()),拿到鎖b,想繼續(xù)拿到鎖a繼續(xù)執(zhí)行,這就形成死鎖,互相持有對面所需要的鎖對象。
如果面試,可以簡單記下,兩個(gè)線程,兩個(gè)鎖對象,鎖互相嵌套,最少兩種狀態(tài),同時(shí)執(zhí)行,一次不行就多次,也可鎖外面加循環(huán),讓線程多次運(yùn)行,就會(huì)死鎖,因?yàn)檫\(yùn)行一次,可能存在偶然,第一個(gè)線程執(zhí)行完了,鎖對象釋放了,第二個(gè)線程才進(jìn)來執(zhí)行,如此就有偶然現(xiàn)象。
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/qq_37347341/article/details/77685590