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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

这个是老师的原代码:
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();
}
运行的结果都不会发生死锁
   
  

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



      

5 个回复

倒序浏览
我也在捉摸呢!!!ca.obb是对象.对象求高手
回复 使用道具 举报
花开~的季节 发表于 2012-2-20 07:45
我也在捉摸呢!!!ca.obb是对象.对象求高手

咱们一起加油啦:victory:
回复 使用道具 举报
陈建凡 发表于 2012-2-20 09:25
咱们一起加油啦

怎么没有高手来解决呢
回复 使用道具 举报
个人感觉在为锁的对象不是同一个,因为static的对象是同一个,而当不是static的时候,对于这两个线程所得到的classSS的对象是不一样了.
static是一个共享的.
回复 使用道具 举报
楼上说的是
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马