一个死锁小程序及其bug

想测试一下写一个死锁小程序,然后就试了一下:

定义了两个静态对象,a,b。两个线程t1,t2.

t1先拿到a的锁,然后在拿b的锁。

t2先拿b的锁,然后拿a的锁,结果失败了,程序竟然没有死锁.

 

 1 public class deadLock {
 2   String a="";
 3  String  b="";
 4  
 5 public static void main(String[] main)
 6 {
 7     Thread t1=new Thread(new Runnable()
 8             {
 9         @Override
10         public void run()
11         {
12             synchronized(a)
13             {
14                 try {
15                     System.out.println(Thread.currentThread().getName()+"+获取a");
16                     TimeUnit.SECONDS.sleep(3);
17                 } catch (InterruptedException e) {
18                     // TODO Auto-generated catch block
19                     e.printStackTrace();
20                 }
21                 synchronized(b)
22                 {
23                     System.out.println(Thread.currentThread().getName()+"+获取b");
24                     try {
25                         TimeUnit.SECONDS.sleep(3);
26                     } catch (InterruptedException e) {
27                         // TODO Auto-generated catch block
28                         e.printStackTrace();
29                     }
30                 }
31             }
32         
33         }
34             });
35     Thread t2=new Thread(new Runnable()
36     {
37 @Override
38 public void run()
39 {
40     synchronized(b)
41     {
42         try {
43             System.out.println(Thread.currentThread().getName()+"+获取b");
44             TimeUnit.SECONDS.sleep(3);
45         } catch (InterruptedException e) {
46             // TODO Auto-generated catch block
47             e.printStackTrace();
48         }
49         synchronized(a)
50         {
51             try {
52                 System.out.println(Thread.currentThread().getName()+"+获取a");
53                 //Thread.sleep(3000);
54                 TimeUnit.SECONDS.sleep(3);
55             } catch (InterruptedException e) {
56                 // TODO Auto-generated catch block
57                 e.printStackTrace();
58             }
59         }
60     }
61     
62 }
63     });
64     t1.start();
65     t2.start();
66     //System.out.println("无锁");
67 }
68 }

结果

通过分析,感觉t1跟t2好像没有一起执行,好像互斥执行,突然想到,加锁的对象是静态变量,那就相当于对这个类加锁。

然后改进,把啊a,b换成实例变量。然后发现还是不行!!!这时候有意思的来了,经过分析,我的a,b都是初始化的""

所以啊a,b放在常量池中,他俩属于同一个对象。然后我把a,b改成不同值,ok~  ~~

      果然,还是懂得底层原理才能行啊,要不然想破头都想不出来。

posted @ 2019-05-26 20:09  pc_m  阅读(288)  评论(0编辑  收藏  举报