Java死锁
代码如下:
1 package com.synchronizeddemo01; 2 3 class Zhangsan{ 4 public void say(){ 5 System.out.println("张三对李四说:“你给我画,我就把书给你”。"); 6 } 7 public void get(){ 8 System.out.println("张三得到了画。"); 9 } 10 } 11 class Lisi{ 12 public void say(){ 13 System.out.println("李四对张三说:“你给我书,我就把画给你”。"); 14 } 15 public void get(){ 16 System.out.println("李四得到了书。"); 17 } 18 } 19 20 public class ThreadDeadLock extends Thread { 21 private static Zhangsan zs = new Zhangsan(); 22 private static Lisi ls = new Lisi(); 23 private boolean flag = false; 24 public void run(){ 25 if(flag){ 26 synchronized (zs) { 27 zs.say();; 28 try{ 29 Thread.sleep(500); 30 }catch(InterruptedException e){ 31 e.printStackTrace(); 32 } 33 synchronized (ls) { 34 zs.get(); 35 } 36 } 37 }else{ 38 synchronized (ls) { 39 ls.say(); 40 try{ 41 Thread.sleep(500); 42 }catch(InterruptedException e){ 43 e.printStackTrace(); 44 } 45 synchronized (zs) { 46 ls.get(); 47 } 48 } 49 } 50 } 51 public static void main(String[] args) { 52 ThreadDeadLock t1 = new ThreadDeadLock(); 53 ThreadDeadLock t2 = new ThreadDeadLock(); 54 t1.flag = true; 55 t2.flag = false; 56 Thread thA = new Thread(t1); 57 Thread thB = new Thread(t2); 58 thA.start(); 59 thB.start(); 60 } 61 62 }
输出结果为:
张三对李四说:“你给我画,我就把书给你”。
李四对张三说:“你给我书,我就把画给你”。
分析:根据本人博客http://www.cnblogs.com/XuGuobao/p/7201715.html中的叙述:防止多个线程同时执行同一个对象的同步代码段。
可以认为,每一个synchronized都对应一个线程,也就是说,每一个对象的synchronized代码块,在执行完全之前,不允许别的线程或者对象参与进来,所以,上边嵌套的synchronized中,synchronized块中的synchronized不能被执行。这就形成了死锁。