今天我们来看个死锁的例子,
1 public class DeadSuo implements Runnable { 2 3 private static Object obj1 = new Object(); 4 5 private static Object obj2 = new Object(); 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 Thread t1 = new Thread(new DeadSuo(), "s1"); 12 Thread t2 = new Thread(new DeadSuo(), "s2"); 13 14 t1.start(); 15 t2.start(); 16 17 } 18 19 @Override 20 public void run() { 21 if (Thread.currentThread().getName().equals("s1")) { 22 m1(Thread.currentThread().getName()); 23 } else { 24 m2(Thread.currentThread().getName()); 25 } 26 } 27 28 /** 29 * 30 */ 31 private void m1(String name) { 32 System.out.println(name); 33 34 synchronized (obj1) { 35 try { 36 Thread.sleep(3000); 37 } catch (Exception e) { 38 e.printStackTrace(); 39 } 40 synchronized (obj2) { 41 System.out.println(obj2); 42 } 43 } 44 45 46 } 47 48 private void m2(String name) { 49 System.out.println(name); 50 51 synchronized (obj2) { 52 try { 53 Thread.sleep(3000); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } 57 synchronized (obj1) { 58 System.out.println(obj1); 59 } 60 } 61 62 } 63 64 }
运行结果 自然是可想而知的, 程序卡住了。
因为t1 调用m1的时候将obj1 这个对象锁住了,
而此时t2 调用 m2 把obj1 锁住了,
等到休眠过后 无论是m1 还是m2 都无法在继续执行了, 因为 m1 在等 obj2的解锁 , 而m2 在等obj1的解锁, 导致谁也不放锁, 谁也拿不到锁!