先看代码在做解释
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),必然死锁,下面来做说明。
这个仅仅是为了理解死锁和面试用的,创建两个对象a和b只是为了作为死锁的对象而用,线程t1运行(t1.start()),线程t1拿到锁a后,需要继续执行,拿到锁b,而线程t2运行(t2.start()),拿到锁b,想继续拿到锁a继续执行,这就形成死锁,互相持有对面所需要的锁对象。
如果面试,可以简单记下,两个线程,两个锁对象,锁互相嵌套,最少两种状态,同时执行,一次不行就多次,也可锁外面加循环,让线程多次运行,就会死锁,因为运行一次,可能存在偶然,第一个线程执行完了,锁对象释放了,第二个线程才进来执行,如此就有偶然现象。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://blog.csdn.net/qq_37347341/article/details/77685590