1. 程式人生 > >Java死鎖

Java死鎖

允許 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死鎖