A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王涛 黑马帝   /  2012-6-24 21:10  /  1887 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王涛 于 2012-6-25 16:17 编辑

  • class Zhangsan
  • {
  •         public void say()
  •         {
  •                 System.out.println("张三对李四说:“你给我画,我就把书给你”");
  •         }
  •         public void get()
  •         {
  •                 System.out.println("张三得到画了");
  •         }
  • }
  • class Lisi
  • {
  •         public void say()
  •         {
  •                 System.out.println("李四对张三说:“你给我书,我就把画给你”");
  •         }
  •         public void get()
  •         {
  •                 System.out.println("李四得到书了");
  •         }
  • }
  • public class ThreadDeadLock implements Runnable
  • {
  •         private static Zhangsan zs = new Zhangsan();
  •         private static Lisi ls = new Lisi();
  •         private boolean flag = false;
  •         public void run()
  •         {
  •                 if(flag)
  •                 {
  •                         synchronized(zs)
  •                         {
  •                                 zs.say();
  •                                 try
  •                                 {
  •                                         Thread.sleep(500);
  •                                 }
  •                                 catch (InterruptedException e)
  •                                 {
  •                                         e.printStackTrace();
  •                                 }
  •                                 synchronized(ls)
  •                                 {
  •                                         zs.get();
  •                                 }
  •                         }
  •                 }else
  •                 {
  •                         synchronized(ls)
  •                                 {
  •                                         ls.say();
  •                                         try
  •                                         {
  •                                                 Thread.sleep(500);
  •                                         }
  •                                         catch (InterruptedException e)
  •                                         {
  •                                                 e.printStackTrace();
  •                                         }
  •                                         synchronized(ls)
  •                                 {
  •                                         zs.get();
  •                                 }
  •                         }
  •                 }
  •         }
  •         public static void main(String[] args)
  •         {
  •                 ThreadDeadLock t1 = new ThreadDeadLock();
  •                 ThreadDeadLock t2 = new ThreadDeadLock();
  •                 t1.flag = true;
  •                 t2.flag = false;
  •                 Thread thA = new Thread(t1);
  •                 Thread thB = new Thread(t2);
  •                 thA.start();
  •                 thB.start();
  •         }
  • }
这个是那个死锁问题,输出应该是:

张三对李四说:“你给我画,我就把书给你”
李四对张三说:“你给我书,我就把画给你”

可是为什么一直没有出现死锁啊,输出的是:

张三对李四说:“你给我画,我就把书给你”
李四对张三说:“你给我书,我就把画给你”
张三得到画了
李四得到书了

谁能看看哪里出错了吗?谢谢了。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
呵呵 首先你和我同学是同一个名字 哈哈, 你的程序没有错误啊 我运行的时候很正常的,确实是死锁啊
回复 使用道具 举报
涛,加油啊,赞一个
回复 使用道具 举报
死锁看人品的,多运行几次试试
回复 使用道具 举报
26.public class ThreadDeadLock implements Runnable
27.{
28.        private static Zhangsan zs = new Zhangsan();
29.
30.        private static Lisi ls = new Lisi();
31.
32.        private boolean flag = false;
33.        
34.        public void run()
35.        {
                while(true)
                {
36.                if(flag)
37.                {
38.                        synchronized(zs)
39.                        {
40.                                zs.say();
41.                                try
42.                                {
43.                                        Thread.sleep(500);
44.                                }
45.                                catch (InterruptedException e)
46.                                {
47.                                        e.printStackTrace();
48.                                }
49.                                synchronized(ls)
50.                                {
51.                                        ls.get();
52.                                }
53.                        }
                             flag = false;
54.                }else
55.                {
56.                        synchronized(ls)
57.                                {
58.                                        ls.say();
59.                                        try
60.                                        {
61.                                                Thread.sleep(500);
62.                                        }
63.                                        catch (InterruptedException e)
64.                                        {
65.                                                e.printStackTrace();
66.                                        }
67.                                        synchronized(zs)
68.                                {
69.                                        zs.get();
70.                                }
                                    flag = true;
71.                        }
72.                }
                 }
73.        }
74.
75.        public static void main(String[] args)
76.        {
77.
78.                ThreadDeadLock t1 = new ThreadDeadLock();
80.
83.
84.                Thread thA = new Thread(t1);
85.                Thread thB = new Thread(t1);
86.
87.                thA.start();
88.                thB.start();
89.
90.        }
91.}

代码改为上面的就行了,我试过了,你自己再试试
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马