Java死鎖
阿新 • • 發佈:2017-07-23
允許 class err pub 完全 tac san 執行 rup
代碼如下:
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不能被執行。這就形成了死鎖。
Java死鎖