黑马程序员技术交流社区

标题: 死锁问题 [打印本页]

作者: 终结者    时间: 2013-11-21 13:53
标题: 死锁问题
本帖最后由 终结者 于 2013-11-21 19:32 编辑

public class ThreadTest{
        public static void main(String[] args) {
                new Thread(new Demo(true)).start();
                new Thread(new Demo(false)).start();
        }
}
class Demo implements Runnable{
        private boolean flag;
        public Demo(boolean flag){
                this.flag=flag;
        }
        @Override
        public void run() {
                while(true){
                        if(flag){
                                synchronized(Demo.class){
                                        System.out.println("Demo.class");
                                        synchronized(this){
                                                System.out.println("this");
                                        }
                                }
                        }
                        else{
                                synchronized(this){
                                        System.out.println("this");
                                        synchronized(Demo.class){
                                                System.out.println("Demo.class");
                                        }
                                }
                        }
                }
               
        }
}
这个为什么没有发生死锁,求解原因
作者: 赵晓海    时间: 2013-11-21 16:54
本帖最后由 赵晓海 于 2013-11-21 20:40 编辑

如果你在同步快中循环输出些数据,运行结果往往是在某一时间段内(很短)只输出flag=true或者flag=false时的数据,可以看到两种情况是互斥的,即一个线程运行时,另一个线程肯定阻塞。
结论:当一个线程访问object的一个synchronized(this)同步代码块时, 其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
这就是为什么不能产生死锁的原因。
这是加了循环的代码:
  1. public class ThreadTest2{

  2.         public static void main(String[] args) {

  3.                 new Thread(new Demo(true)).start();

  4.                 new Thread(new Demo(false)).start();

  5.         }

  6. }

  7. class Demo implements Runnable{

  8.         private boolean flag;

  9.         public Demo(boolean flag){

  10.                 this.flag=flag;

  11.         }

  12.         @Override

  13.         public void run() {

  14.                 while(true){

  15.                    if(flag){

  16.                           synchronized(Demo.class){

  17.                                   for(int x=0;x<=10;x++){

  18.                                    System.out.print(x+" ");

  19.                                    

  20.                                   }System.out.println();

  21.                                   synchronized(this){

  22.                                    for(int x=10;x<=20;x++){

  23.                                     System.out.print(x+" ");

  24.                                     

  25.                                    }System.out.println();

  26.                                   }

  27.                           }

  28.                   }

  29.                   else{

  30.                           synchronized(this){

  31.                            for(int x=10;x>0;x--){

  32.                                   System.out.print('z');

  33.                                  
  34.                                  }System.out.println();

  35.                                   synchronized(Demo.class){

  36.                                    for(int x=10;x>=0;x--){

  37.                                     System.out.print('Z');

  38.                                     

  39.                                    }System.out.println();

  40.                                   }

  41.                           }

  42.                   }

  43.                         

  44. }      }

  45. }
复制代码

作者: 终结者    时间: 2013-11-21 17:39
赵晓海 发表于 2013-11-21 16:54
如果你在同步快中循环输出些数据,运行结果往往是在某一时间段内(很短)只输出flag=true或者flag=false时 ...

还是没有说明白我的程序为什么没有死锁啊,你只是讲了实现死锁的原理,还有我不知道你为啥在里面要加上循环。跟我说的没有任何关系啊。我想问的是,我的程序没有死锁的原因出在哪里
作者: FFF    时间: 2013-11-21 18:35
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~




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