黑马程序员技术交流社区

标题: 谁帮我测试一下看有没有安全问题?为什么我测试有问题? [打印本页]

作者: 魏冬    时间: 2012-12-13 17:03
标题: 谁帮我测试一下看有没有安全问题?为什么我测试有问题?
class resource_1{
        String name;
        String sex;
        boolean b=false;
}
class input_1 implements Runnable{
        resource_1 r;
         input_1(resource_1 r){
                 this.r=r;
         }
         public void run(){
                 int x=0;
                 while(true){
                         synchronized(r){
                                 if(r.b){
                                         try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                         if(x==0){
                                                 r.name="丽丽";
                                                 r.sex="女";
                                         }else{
                                                 r.name="旺财";
                                                 r.sex="男";
                                         }
                                 }
                                 r.b=true;
                                 r.notify();
                         }
                         x=(x+1)%2;
                 }
               
         }
       
}
class output_1 implements Runnable{
        resource_1 r;
        output_1(resource_1 r){
                this.r=r;
        }
        public void run(){
                while(true){
                        synchronized(r){
                                if(!r.b){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(r.name+"....."+r.sex);
                                }
                                r.b=false;
                                r.notify();
                        }
                }
        }
}
public class 等待唤醒机制 {
                public static void main(String[] args){
                        resource_1 r=new resource_1();
                        input_1 in=new input_1(r);
                        output_1 out=new output_1(r);
                        Thread t=new Thread(in);
                        Thread t1=new Thread(out);
                        t.start();
                        t1.start();
                }

}
作者: 焦健    时间: 2012-12-13 19:33

class resource_1{
        String name;
        String sex;
        boolean b=false;
}
class input_1 implements Runnable{
        resource_1 r;
         input_1(resource_1 r){
                 this.r=r;
         }
         public void run(){
                 int x=0;
                 while(true){
                         synchronized(r){
                                 if(r.b){
                                         try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                         if(x==0){
                                                 r.name="丽丽";
                                                 r.sex="女";
                                         }else{
                                                 r.name="旺财";
                                                 r.sex="男";
                                         }
                                 }
                                 /*这里不能这么写,上面的if语句不能把
                                                  if(x==0){
                                                      r.name="丽丽";
                                                 r.sex="女";
                                         }else{
                                                 r.name="旺财";
                                                 r.sex="男";
                                这句包含起来,包含起来第一次就执行不到了,无法进行赋值,如果像下面那样
                                加上sleep语句,就会看到打印的是null值;你可以更改sleep参数试一下,
                                */
                                 r.b=true;
                                 r.notify();
                         }
                         try {
                                                        Thread.sleep(10);
                                                } catch (InterruptedException e) {
                                                        // TODO 自动生成的 catch 块
                                                        e.printStackTrace();
                         x=(x+1)%2;//这句用该放到同步代码快中,如果放在这里,前面加上sleep语句你会看到属性都是连续打印的。
                 }
               
         }
        
}
class output_1 implements Runnable{
        resource_1 r;
        output_1(resource_1 r){
                this.r=r;
        }
        public void run(){
                while(true){
                        synchronized(r){
                                if(!r.b){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(r.name+"....."+r.sex);
                                }
                                r.b=false;
                                r.notify();
                        }
                }
        }
}
public class 等待唤醒机制 {
    public static void main(String[] args){
            resource_1 r=new resource_1();
            input_1 in=new input_1(r);
            output_1 out=new output_1(r);
            Thread t=new Thread(in);
            Thread t1=new Thread(out);
            t.start();
            t1.start();
    }

}
下面贴出我修改过的

作者: 焦健    时间: 2012-12-13 19:34
      
class resource_1{
        String name;
        String sex;
        boolean b=false;
}
class input_1 implements Runnable{
        resource_1 r;
         input_1(resource_1 r){
                 this.r=r;
         }
         public void run(){
                 int x=0;
                 while(true){
                         synchronized(r){
                                 if(r.b)
                                 {
                                         try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                  }
                                   if(x==0){
                                         r.name="丽丽";
                                           r.sex="女";
                                   }else{
                                        r.name="旺财";
                                        r.sex="男";
                                  }
                                 
                                 r.b=true;
                                 r.notify();
                                 x=(x+1)%2;
                         }
                     
                 }
               
         }
        
}
class output_1 implements Runnable{
        resource_1 r;
        output_1(resource_1 r){
                this.r=r;
        }
        public void run(){
                while(true){
                        synchronized(r){
                                if(!r.b){
                                        try {
                                                r.wait();
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println(r.name+"....."+r.sex);
                                }
                                r.b=false;
                                r.notify();
                        }
                }
        }
}
public class Duo1 {
                public static void main(String[] args){
                        resource_1 r=new resource_1();
                        input_1 in=new input_1(r);
                        output_1 out=new output_1(r);
                        Thread t=new Thread(in);
                        Thread t1=new Thread(out);
                        t.start();
                        t1.start();
                }

}




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