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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 终结者 中级黑马   /  2013-11-21 13:53  /  1110 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 终结者 于 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");
                                        }
                                }
                        }
                }
               
        }
}
这个为什么没有发生死锁,求解原因

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 问题有点水~所以~你懂的~~

查看全部评分

5 个回复

倒序浏览
本帖最后由 赵晓海 于 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. }
复制代码

点评

FFF
虽然解释离完美还有一定的进步的空间,但、我已经看到了你的努力!感谢你长久以来对云七的支持!特此活动额外技术分+1送上!!!  发表于 2013-11-21 18:35

评分

参与人数 1技术分 +2 收起 理由
FFF + 2 活动额外技术分+1

查看全部评分

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

还是没有说明白我的程序为什么没有死锁啊,你只是讲了实现死锁的原理,还有我不知道你为啥在里面要加上循环。跟我说的没有任何关系啊。我想问的是,我的程序没有死锁的原因出在哪里

点评

FFF
这是一个很严重的问题。但,如果你再认真一点仔细一点。也许你就能自己发现问题在那里了呢~  发表于 2013-11-21 18:37
回复 使用道具 举报
FFF 金牌黑马 2013-11-21 18:35:19
板凳
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
如果没有解决,可能你的问题问得不够清楚。可以重新发问的哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马