一个死锁小程序及其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~ ~~
果然,还是懂得底层原理才能行啊,要不然想破头都想不出来。