黑马程序员技术交流社区

标题: 大家看看我这个是死锁麽 为啥锁不上啊 [打印本页]

作者: 玥夜    时间: 2014-8-9 10:45
标题: 大家看看我这个是死锁麽 为啥锁不上啊
本帖最后由 玥夜 于 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>
复制代码



作者: 地狱天堂    时间: 2014-8-9 11:57
Object o1= new Object();
Object o2= new Object();
前面加static 就成死锁了。
至于原因,请楼下补充。
作者: 裤裆里的温柔、    时间: 2014-8-9 12:14
首先判断后马上就锁住了o1,接着马上就锁住了o2,因为只有打印语句,执行速度非常非常快,另一个线程都来不及锁定那边就全锁住了。接着o1和o2就解锁。。。。。锁定第一个对象后睡眠一下应该能解决
作者: jwx555    时间: 2014-8-9 12:50
楼上说的对,毕姥爷演示的时候不是也睡眠了么
作者: 如海之鑫    时间: 2014-8-9 12:54
同上面的说法,static
作者: 陶圣虎    时间: 2014-8-9 13:15
是因为你传入的  
Thread t1=new Thread(new Test(false));
Thread t2=new Thread(new Test(true));
两个对象,两个对象中都有o1 和o2 对象,相当于有4个对象。
2楼说的加上static就可以了 成为静待类变量,就永远只有两个对象了
作者: 地狱天堂    时间: 2014-8-9 13:55
原因如下:
因为你的Test类里面有2个成员o1,o2
new 一个 Test(false) 那么他就有自己的o1和o2,
new 一个 Test(true) 那么他也有自己的o1和o2,
这点很重要。如果不是静态的话,那么运行时,2线程各自调用自己的o1和o2成员。一个进if,一个进else.所以不会死锁。
所以关于你的问题,我发现毕老师在死锁那一节课中关于static的解释有误。他说前面加static是为了方便调用,不用在调用时再创建对象。我把static去掉。再创建对象的话也是不会死锁,所以static是必须的。
作者: 玥夜    时间: 2014-8-9 14:20
地狱天堂 发表于 2014-8-9 13:55
原因如下:
因为你的Test类里面有2个成员o1,o2
new 一个 Test(false) 那么他就有自己的o1和o2,

恩 明白了 谢谢
作者: 玥夜    时间: 2014-8-9 14:21
陶圣虎 发表于 2014-8-9 13:15
是因为你传入的  
Thread t1=new Thread(new Test(false));
Thread t2=new Thread(new Test(true));

谢谢 明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2