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

本帖最后由 刘源 于 2012-7-11 17:48 编辑

        这个程序是毕老师死锁的最后一个程序 DeadLockTest。相同的我就不写了。我相信大家都看过了,我说下我的发现把,
class MyLock
{
        static Object locka = new Object();
        static Object lockb = new Object();
}

这个是原程序作用是:synchronized(MyLock.lockb),synchronized(MyLock.locka)。这个程序我进过多次实验,效果和视频里的一样,基本很多次都会死锁。感觉很happy。
当时毕老师说用静态是为了方便调用,我也没有多想,这次我把静态去掉了,自己搞了方法调用,代码如下。
class MyLock  
{
         Object locka = new Object();
         Object lockb = new Object();
         public Object getN1(){return locka;}
         public Object getN2(){return lockb; }

然后用的 synchronized(new MyLock().getN1()), synchronized(new MyLock().getN2())。其他都没变。然后悲剧的发现,以前能锁上的现在。锁不上了,
难度这个死锁还是 synchronized()内的对象是不是静态还有关系吗。。。。{:soso_e136:}还是我太衰了。。。。希望你们也多做下实验,反正我这里是死锁不上了。唉。。。

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 学习就是一个不断发现问题,解决问题的过程.

查看全部评分

2 个回复

倒序浏览
本帖最后由 彭盼 于 2012-7-11 14:45 编辑

同志,你这样new MyLock()是不行的,你这样就建立了四个匿名的对象,
也就是说四把锁是完全不同的,怎么可能锁住呢
按你的想法,我想代码可以这样写:
package cn.pengpan.fuxi1;
class Test implements Runnable
{
private boolean flag;
private MyLock myLock;
Test(boolean flag,MyLock myLock)//把同一个锁资源作为构造函数传入,确保两个线程操作一个资源
{
  this.flag = flag;
  this.myLock=myLock;
}
public void run()
{
  if(flag)
  {
   while(true)
   {
    synchronized(myLock.locka)
    {
     System.out.println(Thread.currentThread().getName()+"...if locka ");
     synchronized(myLock.lockb)
     {
      System.out.println(Thread.currentThread().getName()+"..if lockb");     
     }
    }
   }
  }
  else
  {
   while(true)
   {
    synchronized(myLock.lockb)
    {
     System.out.println(Thread.currentThread().getName()+"..else lockb");
     synchronized(myLock.locka)
     {
      System.out.println(Thread.currentThread().getName()+".....else locka");
     }
    }
   }
  }
}
}

class MyLock
{
Object locka = new Object();
Object lockb = new Object();
}
class  DeadLockTest
{
public static void main(String[] args)
{
  MyLock myLock=new MyLock();//保证两个线程都是操作的是同一个资源
  Thread t1 = new Thread(new Test(true,myLock));//myLock自身拥有两把锁,可以保证两个线程发生死锁
  Thread t2 = new Thread(new Test(false,myLock));
  t1.start();
  t2.start();
}
}

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
你这里调用一次就要new 一个对象,同步的对象就不是一个了,所以就不行噻。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马