黑马程序员技术交流社区

标题: 在毕老师的多线程-死锁那章有个问题不明白 [打印本页]

作者: 陈建凡    时间: 2012-2-20 00:53
标题: 在毕老师的多线程-死锁那章有个问题不明白
这个是老师的原代码:
class sisuo
{
  public static void main(String [] args)
   {
           SiSuoTest  st=new SiSuoTest(true);
           Thread t1=new Thread(st);
           t1.start();
           SiSuoTest  st2=new SiSuoTest(false);
           Thread t2=new Thread(st2);
           t2.start();
   }
}
class SiSuoTest implements Runnable
{
   private        boolean  flag;
  //classSS ca=new classSS();
   
        SiSuoTest(boolean  flag)
        {
         this.flag=flag;
        }
        public void run()
        {
                  if(flag)
                  {
                          synchronized(classSS.oba)
                          {
                                  System.out.println("if oba---------");
                                  synchronized(classSS.obb)
                            {
                                   System.out.println("if obb--------");
                            }
                          }
                         
                  }
                  else
                  {
                          synchronized(classSS.obb)
                          {
                                  System.out.println("else obb---");
                                  synchronized(classSS.oba)
                            {
                                   System.out.println("else oba---");
                            }
                          }
                  }
        }       
}
class classSS
{
static Object oba=new Object();
static Object obb=new Object();
}

运行的结果是发生死锁:
   


然后我把锁的改了一下
class sisuo
{

  public static void main(String [] args)
   {
           SiSuoTest  st=new SiSuoTest(true);
           Thread t1=new Thread(st);
           t1.start();
           SiSuoTest  st2=new SiSuoTest(false);
           Thread t2=new Thread(st2);
           t2.start();
   }
}
class SiSuoTest implements Runnable
{
   private        boolean  flag;
   classSS ca=new classSS();//实例化classSS 类
   
        SiSuoTest(boolean  flag)
        {
         this.flag=flag;
        }
        public void run()
        {
                  if(flag)
                  {
                          synchronized(ca.oba)
                          {
                                  System.out.println("if oba---------");
                                  synchronized(ca.obb)
                            {
                                   System.out.println("if obb--------");
                            }
                          }
                         
                  }
                  else
                  {
                          synchronized(ca.obb)
                          {
                                  System.out.println("else obb---");
                                  synchronized(ca.oba)
                            {
                                   System.out.println("else oba---");
                            }
                          }
                  }
        }
       
       
}
class classSS
{
  //这里改动了
  Object oba=new Object();
  Object obb=new Object();
}
运行的结果都不会发生死锁
   
  

  这里的锁,发生了什么改变?  



      

作者: 花开~的季节    时间: 2012-2-20 07:45
我也在捉摸呢!!!ca.obb是对象.对象求高手
作者: 陈建凡    时间: 2012-2-20 09:25
花开~的季节 发表于 2012-2-20 07:45
我也在捉摸呢!!!ca.obb是对象.对象求高手

咱们一起加油啦:victory:
作者: 花开~的季节    时间: 2012-2-20 11:42
陈建凡 发表于 2012-2-20 09:25
咱们一起加油啦

怎么没有高手来解决呢
作者: 【专】【属】    时间: 2012-2-20 15:17
个人感觉在为锁的对象不是同一个,因为static的对象是同一个,而当不是static的时候,对于这两个线程所得到的classSS的对象是不一样了.
static是一个共享的.
作者: 最初的理想    时间: 2012-2-20 20:12
楼上说的是




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