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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 曹恒业 于 2012-7-14 10:47 编辑

/*
本例是day11天最后一个视频中关于死锁的例子,
当时毕老师用MyLock类的2个静态对象实现锁,我之后试了下非静态的锁对象,发现锁不住了。
代码如下所示,除了注释之处,其他地方未曾改动。
不知道哪里出了问题,求助大家。
希望大家能用截图证明自己的程序,谢谢
*/
class Test implements Runnable
{
        private boolean flag;
        Test(boolean flag)
        {
                this.flag = flag;
        }

        public void run()
        {
                MyLock lock = new MyLock();     //为了使用非静态锁对象而新建的MyLock类的lock对象
               
                if(flag)
                {
                        while(true)
                        {
                                synchronized(lock.locka)  //非静态lock.locka锁对象
                                {
                                        System.out.println(Thread.currentThread().getName()+"...if locka ");

                                        synchronized(lock.lockb) //非静态lock.lockb锁对象
                                        {
                                                System.out.println(Thread.currentThread().getName()+"..if lockb");                                       
                                        }
                                }
                        }
                }
                else
                {
                        while(true)
                        {
                                synchronized(lock.lockb) //非静态lock.lockb锁对象
                                {
                                        System.out.println(Thread.currentThread().getName()+"..else lockb");

                                        synchronized(lock.locka) //非静态lock.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)
        {
                Thread t1 = new Thread(new Test(true));
                Thread t2 = new Thread(new Test(false));
                t1.start();
                t2.start();
        }
}

3 个回复

倒序浏览
  1. class Test implements Runnable

  2. {   
  3.         private boolean flag;
  4.         MyLock lock ;           
  5.         Test(boolean flag,MyLock lock)  //讲 lock 作为参数 由构造器传入  这样就可以保证使用同一个 lock lock 下的对象也是相同的
  6.         {
  7.                 this.flag = flag;
  8.                 this.lock =lock;
  9.         }

  10.         public void run()
  11.         {
  12.                
  13.                 if(flag)
  14.                 {
  15.                         while(true)
  16.                         {
  17.                                 synchronized(lock.locka)  //非静态lock.locka锁对象
  18.                                 {
  19.                                         System.out.println(Thread.currentThread().getName()+"...if locka ");

  20.                                         synchronized(lock.lockb) //非静态lock.lockb锁对象
  21.                                         {
  22.                                                 System.out.println(Thread.currentThread().getName()+"..if lockb");                                       
  23.                                         }
  24.                                 }
  25.                         }
  26.                 }
  27.                 else
  28.                 {
  29.                         while(true)
  30.                         {
  31.                                 synchronized(lock.lockb) //非静态lock.lockb锁对象
  32.                                 {
  33.                                         System.out.println(Thread.currentThread().getName()+"..else lockb");

  34.                                         synchronized(lock.locka) //非静态lock.locka锁对象
  35.                                         {
  36.                                                 System.out.println(Thread.currentThread().getName()+".....else locka");
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }
  41.         }
  42. }

  43. class MyLock
  44. {
  45.         Object locka = new Object();
  46.         Object lockb = new Object();
  47. }

  48. public class  DeadLockTest
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                 MyLock lock = new MyLock();
  53.                        
  54.                                
  55.                 Thread t1 = new Thread(new Test(true,lock));
  56.                 Thread t2 = new Thread(new Test(false,lock));
  57.                 t1.start();
  58.                 t2.start();
  59.         }
  60. }
复制代码
仔细看这里:Thread t1 = new Thread(new Test(true));
                Thread t2 = new Thread(new Test(false));
你在创建线程时  新建了 两个 Test 对象,这两个对象里 创建的 Mylock 对象是不同的 ,当然无法锁住对方了。
要保证同步代码使用的是同一把锁

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
丁二跃 发表于 2012-7-14 10:25
仔细看这里:Thread t1 = new Thread(new Test(true));
                Thread t2 = new Thread(new Test( ...

非常清晰,谢谢这位兄弟的指点~~
回复 使用道具 举报
本帖最后由 rslheima 于 2012-7-14 17:33 编辑

看看。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马