码迷,mamicode.com
首页 > 编程语言 > 详细

Java死锁

时间:2017-07-23 00:55:26      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:int   adl   log   oid   deadlock   rgs   pac   bool   完全   

代码如下:

 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死锁

标签:int   adl   log   oid   deadlock   rgs   pac   bool   完全   

原文地址:http://www.cnblogs.com/XuGuobao/p/7223208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!