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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 玥夜 中级黑马   /  2014-8-9 10:45  /  2085 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 玥夜 于 2014-8-9 14:24 编辑

我把视频中的锁定义到了实现Runnable的类中了,我这运行就锁不上,视频上是单独定义了一个类放锁,可是按着视频写也是能锁上的,不知道为啥,请大家帮忙给看看,谢谢

  1. <p> public class 死锁 {
  2. public static void main(String[] args)
  3. {
  4.   Thread t1=new Thread(new Test(false));
  5.   Thread t2=new Thread(new Test(true));
  6.   t1.start();
  7.   t2.start();
  8. }
  9. }</p><p>class Test implements Runnable
  10. {
  11. private boolean b;
  12. Object o1= new Object();
  13. Object o2= new Object();
  14. Test(boolean b)
  15. {
  16.   this.b=b;
  17. }
  18. public void run()
  19. {
  20.   if(b)
  21.   {
  22.    while(true)
  23.    {
  24.     synchronized(o1)
  25.     {
  26.      System.out.println("if 11");
  27.      synchronized(o2)
  28.      {
  29.       System.out.println("if 22222");
  30.      }
  31.     }
  32.    }
  33.   }
  34.   else
  35.   {
  36.    while(true)
  37.    {
  38.     synchronized(o2)
  39.     {
  40.      System.out.println("else 11");
  41.      synchronized(o1)
  42.      {
  43.       System.out.println("else 22222");
  44.      }
  45.     }
  46.    }
  47.   }
  48. }
  49. }</p>
复制代码


评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

11 个回复

倒序浏览
Object o1= new Object();
Object o2= new Object();
前面加static 就成死锁了。
至于原因,请楼下补充。

点评

楼下已补充  发表于 2014-8-9 14:22
回复 使用道具 举报
首先判断后马上就锁住了o1,接着马上就锁住了o2,因为只有打印语句,执行速度非常非常快,另一个线程都来不及锁定那边就全锁住了。接着o1和o2就解锁。。。。。锁定第一个对象后睡眠一下应该能解决

点评

额 请看楼下解释 他们用的不是一个锁  发表于 2014-8-9 14:23
回复 使用道具 举报
楼上说的对,毕姥爷演示的时候不是也睡眠了么

点评

是不是同一个锁 具体请看楼下解释  发表于 2014-8-9 14:24
回复 使用道具 举报
同上面的说法,static
回复 使用道具 举报
是因为你传入的  
Thread t1=new Thread(new Test(false));
Thread t2=new Thread(new Test(true));
两个对象,两个对象中都有o1 和o2 对象,相当于有4个对象。
2楼说的加上static就可以了 成为静待类变量,就永远只有两个对象了
回复 使用道具 举报 1 0
原因如下:
因为你的Test类里面有2个成员o1,o2
new 一个 Test(false) 那么他就有自己的o1和o2,
new 一个 Test(true) 那么他也有自己的o1和o2,
这点很重要。如果不是静态的话,那么运行时,2线程各自调用自己的o1和o2成员。一个进if,一个进else.所以不会死锁。
所以关于你的问题,我发现毕老师在死锁那一节课中关于static的解释有误。他说前面加static是为了方便调用,不用在调用时再创建对象。我把static去掉。再创建对象的话也是不会死锁,所以static是必须的。

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 赞一个!

查看全部评分

回复 使用道具 举报
地狱天堂 发表于 2014-8-9 13:55
原因如下:
因为你的Test类里面有2个成员o1,o2
new 一个 Test(false) 那么他就有自己的o1和o2,

恩 明白了 谢谢
回复 使用道具 举报
陶圣虎 发表于 2014-8-9 13:15
是因为你传入的  
Thread t1=new Thread(new Test(false));
Thread t2=new Thread(new Test(true));

谢谢 明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马