黑马程序员技术交流社区

标题: 我写的死锁,不报错但是运行输出空白( ⊙ o ⊙ )啊! [打印本页]

作者: 吴刚    时间: 2013-5-17 23:10
标题: 我写的死锁,不报错但是运行输出空白( ⊙ o ⊙ )啊!
本帖最后由 吴刚 于 2013-5-28 23:21 编辑
  1. <div class="blockcode"><blockquote>class R {
  2.         String name;
  3.         int age;
  4.         boolean f = false;
  5.         
  6.         public synchronized void set(String name, int age) {
  7.                 if (f) {
  8.                         try {
  9.                                 this.wait();
  10.                         } catch (Exception e) {
  11.                                 // TODO: handle exception
  12.                         }
  13.                         this.name = name;
  14.                         this.age = age;
  15.                         f = true;
  16.                         this.notify();
  17.                 }
  18.         }
  19.         
  20.         public synchronized void out() {
  21.                 if (!f) {
  22.                         try {
  23.                                 this.wait();
  24.                         } catch (Exception e) {
  25.                                 // TODO: handle exception
  26.                         }
  27.                         System.out.println(name+"..."+age);
  28.                         f = false;
  29.                         this.notify();
  30.                 }
  31.         }
  32. }

  33. class Input implements Runnable {
  34.         private R r;
  35.         Input(R r){
  36.                 this.r = r;
  37.         }
  38.         
  39.         public void run(){
  40.                 int x =0;
  41.                 while (true) {
  42.                         if(x == 0) {
  43.                                 r.set("张三",10000);
  44.                         }else
  45.                                 r.set("wad", 1);
  46.                         x = (1+x)%2;
  47.                 }
  48.         }
  49. }

  50. class Output implements Runnable {
  51.         private R r;
  52.         public Output(R r) {
  53.                 // TODO Auto-generated constructor stub
  54.                 this.r = r;
  55.         }
  56.         public void run() {
  57.                 while (true) {
  58.                         r.out();
  59.                 }
  60.         }
  61. }


  62. public class InOutTest {

  63.         /**
  64.          * @param args
  65.          */
  66.         public static void main(String[] args) {
  67.                 // TODO Auto-generated method stub
  68.                 R r = new R();
  69.                 new Thread(new Input(r)).start();
  70.                 new Thread(new Output(r)).start();
  71.                
  72.         }

  73. }
复制代码
大家帮忙看看,并且我还有点疑问,就是boolean flag = false;那么使用 if(!flag)和if(flag == true)是一个意思吧,不知道大家常用的是那个....


作者: librazeng    时间: 2013-5-18 00:55
你这不是死锁程序啊!
1.不报错但是运行输出空白( ⊙ o ⊙ )啊!
默认设置为false,set里 if (f),条件为假,所以线程new Thread(new Input(r)).start()不会进去set;
接着线程new Thread(new Output(r)).start()运行,进去直接this.wait();
这样一条线程睡着了,一条线程永远做着无聊的while循环(set不鸟)。
所以你就看到,没有输出但线程未停止。至于报错,我这里测试没出现!
2.boolean flag = false;那么使用 if(!flag)和if(flag == true)是一个意思吧
!flag的结果是true,flag==true的结果是false,所以不是一个意思。

贴一个我写的死锁程序(核心在于一个锁里持有另一个锁):
  1. public class DeadLock2 implements Runnable{

  2.         /**
  3.          * @param args
  4.          */
  5. static boolean flag=true;
  6.         public void run(){
  7.                 if(flag){
  8.                         while(true){
  9.                                 synchronized(this.getClass()){
  10.                                         try{Thread.sleep(10);}catch(InterruptedException e){}
  11.                                         System.out.println(Thread.currentThread().getName()+"把锁给我,我是你哥!");//-->0
  12.                                         synchronized(this){
  13.                                                 try{Thread.sleep(10);}catch(InterruptedException e){}
  14.                                                 System.out.println(Thread.currentThread().getName()+"把锁给我,我是你妹!");
  15.                                         }
  16.                                 }
  17.                         }
  18.                 }else{
  19.                         while(true){
  20.                                 synchronized(this){
  21.                                         System.out.println(Thread.currentThread().getName()+"把锁给我,我是你妹!");//-->1
  22.                                         synchronized(this.getClass()){
  23.                                                 System.out.println(Thread.currentThread().getName()+"把锁给我,我是你哥!");
  24.                                         }
  25.                                 }
  26.                         }
  27.                 }
  28.         }
  29.         public static void main(String[] args) {
  30.                 // TODO Auto-generated method stub
  31.                 DeadLock2 d=new DeadLock2();
  32.                 Thread a=new Thread(d);
  33.                 Thread b=new Thread(d);
  34.                 a.start();
  35.                 try{Thread.sleep(10);}catch(InterruptedException e){}
  36.                 flag=false;
  37.                 b.start();
  38.         }
  39. }
复制代码

作者: 吴刚    时间: 2013-5-18 20:06
额,谢谢楼上了
作者: 赵崇友    时间: 2013-5-18 21:07
一楼的哥们写的代码有意思。。。。
作者: 殇_心。    时间: 2013-5-18 21:13
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!




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