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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐传任 中级黑马   /  2012-9-17 20:39  /  1337 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Test implements Runnable
  2. {
  3.         private boolean flag;
  4.         Test(boolean flag)
  5.         {
  6.                 this.flag = flag;
  7.         }

  8.         public void run()
  9.         {
  10.                 if(flag)
  11.                 {
  12.                         synchronized(MyLock.locka)
  13.                         {
  14.                                 System.out.println("if locka.....");
  15.                                 synchronized(MyLock.lockb)
  16.                                 {
  17.                                         System.out.println("if lockb.....");
  18.                                 }
  19.                         }
  20.                 }
  21.                 else
  22.                 {
  23.                         synchronized(MyLock.lockb)
  24.                         {
  25.                                 System.out.println("else lockb.....");
  26.                                 synchronized(MyLock.locka)
  27.                                 {
  28.                                         System.out.println("else locka.....");
  29.                                 }
  30.                         }
  31.                 }
  32.         }
  33. }

  34. class MyLock
  35. {
  36.         public static Object locka = new Object();
  37.         public static Object lockb = new Object();
  38. }

  39. class DeadLockTest2
  40. {
  41.         public static void main(String[] args)
  42.         {
  43.                 Test a = new Test(true);
  44.                 Test b = new Test(false);
  45.                 Thread t1 = new Thread(a);//毕老师所说的线程任务必须是一个对象,但是在这里有a,b两个对象
  46.                 Thread t2 = new Thread(b);//我知道所执行的run方法是同一个,但是对于flag我还是不理解
  47.                 t1.start();
  48.                 t2.start();
  49.         }
  50. }
复制代码
毕老师所说的线程任务必须是一个对象,但是在这里有a,b两个对象,我知道所执行的run方法是同一个,但是对于flag我还是不理解,视频中毕老师说是flag只能取这两个值,如果换成int num就不可以了,我对flag这里还是不明白,转不过来,麻烦帮忙再给我讲解一下,谢谢了

3 个回复

倒序浏览
这里的flag是一个标志位,它是boolean型变量,只有2个值就是 true和false.
Test a = new Test(true);
Thread t1 = new Thread(a);//这里创建t1线程,然后往Test类的构造函数中的flag标志位传入true.
if(flag)  就相当于if(true)满足就执行了。
如果是if(!flag) 就相当于if(false)就执行else。                              

回复 使用道具 举报
在此处的flag只是一个boolean来确定到底执行那一块代码的,其实如果你换成int num我感觉也是可以的不过是判断的条件会变一下比如:
class Test implements Runnable

{

        private int a;

        Test(int a)

        {

                this.a = a;

        }



        public void run()

        {

                if(this.a==1)

                {

                        synchronized(MyLock.locka)

                        {

                                System.out.println("if locka.....");

                                synchronized(MyLock.lockb)

                                {

                                        System.out.println("if lockb.....");

                                }

                        }

                }

                else

                {

                        synchronized(MyLock.lockb)

                        {

                                System.out.println("else lockb.....");

                                synchronized(MyLock.locka)

                                {

                                        System.out.println("else locka.....");

                                }

                        }

                }

        }

}


class MyLock

{

        public static Object locka = new Object();

        public static Object lockb = new Object();

}


class DeadLockTest2

{

        public static void main(String[] args)

        {

                Test a = new Test(1);

                Test b = new Test(2);

                Thread t1 = new Thread(a);//毕老师所说的线程任务必须是一个对象,但是在这里有a,b两个对象

                Thread t2 = new Thread(b);//我知道所执行的run方法是同一个,但是对于flag我还是不理解

                t1.start();

                t2.start();

        }

}
关键就是要明白代码执行的原理!希望可以帮到你!
回复 使用道具 举报

  1. <P> </P>
复制代码
class Test implements Runnable
{
        private boolean flag;//把成员变量换成数字,字母都可以,就是一个标识而起,因为boolean只有两个值,用起来比较方便。
        Test(boolean flag)
        {
                this.flag = flag;
        }
        public void run()
        {
                if(flag)//相当于 if(true)  或 if(flag==true)
                {
                        synchronized(MyLock.locka)
                        {
                                System.out.println("if locka.....");
                                synchronized(MyLock.lockb)
                                {
                                        System.out.println("if lockb.....");
                                }
                        }
                }
                else// 这时 flag != true  ,即flag == false
                {
                        synchronized(MyLock.lockb)
                        {
                                System.out.println("else lockb.....");
                                synchronized(MyLock.locka)
                                {
                                        System.out.println("else locka.....");
                                }
                        }
                }
        }
}
class MyLock
{
        public static Object locka = new Object();
        public static Object lockb = new Object();
}
class DeadLockTest2
{
        public static void main(String[] args)
        {
                Test a = new Test(true);
                Test b = new Test(false);
                Thread t1 = new Thread(a);
    /*这个传入的参数是要运行run方法中的下面这部分
    if(flag)
                {
     synchronized(MyLock.locka)
                        {
                                System.out.println("if locka.....");
                                synchronized(MyLock.lockb)
                                {
                                        System.out.println("if lockb.....");
                                }
                        }
    */
                Thread t2 = new Thread(b);
    /*这个传入的参数是 false,所以运行的是run方法中的下面这部分
       else
                {
                        synchronized(MyLock.lockb)
                        {
                                System.out.println("else lockb.....");
                                synchronized(MyLock.locka)
                                {
                                        System.out.println("else locka.....");
                                }
                        }
                }   
    */
                t1.start();
                t2.start();
        }
}
flag标志就是为了引发死锁而起,没啥特别的吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马