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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Shimano 于 2014-5-22 15:46 编辑
  1. class Rec
  2. {
  3.         String name;
  4.         String sex;
  5.         boolean flag = false;
  6. }
  7. class Input implements Runnable
  8. {
  9.         private Rec r;
  10.         Input(Rec r)
  11.         {
  12.                 this.r = r;
  13.         }
  14.         public void run()
  15.         {
  16.                 int x = 0;
  17.                 while(true)
  18.                 {        
  19.                         if(x==0)
  20.                         {
  21.                                 r.name = "Mike";
  22.                                 r.sex = "Man";
  23.                         }else
  24.                         {
  25.                                 r.name = "丽丽";
  26.                                 r.sex = "女女女女女";
  27.                         }
  28.                         x = (x+1)%2;
  29.                 }
  30.         }
  31. }


  32. class Output implements Runnable
  33. {
  34.         private Rec r;
  35.         Output(Rec r)
  36.         {
  37.                 this.r = r;
  38.         }
  39.         public void run()
  40.         {
  41.                 while(true)
  42.                 {                        
  43.                         System.out.println(r.name+"....."+r.sex);
  44.                 }        
  45.         }
  46. }
  47. class InputOutputDemo
  48. {
  49.         public static void main(String[] args)
  50.         {
  51.                 Rec r = new Rec();
  52.                
  53.                 Input in = new Input(r);
  54.                 Output out = new Output(r);
  55.                
  56.                 Thread t1 = new Thread(in);
  57.                 Thread t2 = new Thread(out);
  58.                
  59.                 t1.start();
  60.                 t2.start();
  61.         }
  62. }
复制代码
以下是即没有同步也没有判断的情况下的一些不安全情况:我这样的理解对不对?求证实....
1.当打印出:
                        null.....null
                        null.....null
                        null.....null
        是因为:两个线程一旦开启,输出线程就抢到执行权,因为name和sex还没有赋值,所以只能打印出空(已经被证实)

2.当打印出:
                        Mike.....女女女女女
        是因为:输入"Mike" "man"但是没有打印,然后又输入"丽丽" "女女女女女"但还是没有被打印,又输入"Mike"时,还没有输入"man"就被输出抢到执行权,

3.当打印出:
                        丽丽.....Man
        是因为:输入"Mike" "man"但是没有打印,然后输入"丽丽",还没有传入"女女女女",就被输出抢到执行权,

4.如果我的猜想是正确的,理论上讲,
第一行有可能会打印出:Mike.....null这种的情况,我的猜想是不是正确的?求解答....

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

1 个回复

正序浏览
恩,你的猜想是正确的,线程刚运行时,当r.name = "Mike";刚执行完,就被输出语句抢到执行权的时候,就会出现Mike.....null这种的情况。你可以在21行:r.name = "Mike";的后面加上Thread.sleep(1000);试试,估计就很可能会出现这种情况了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马