package t055;public class Threads1 {
int x=0;

public class Runner implements Runnable{ public void run() {
int current=0;
for (int i = 0; i < 4; i++) {
current=x;
System.out.print(current+", ");
x=current+2;
}
}

}

public static void main(String[] args) {
new Threads1().go();
}

public void go(){
Runner r=new Runner();
new Thread(r).start();
new Thread(r).start();
}}Which two are possible results? (Choose two.) A.   0, 2, 4, 4, 6, 8, 10, 6, 
B.    0, 2, 4, 6, 8, 10, 2, 4, 
C.    0, 2, 4, 6, 8, 10, 12, 14, 
D.  0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 
E.    0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, Answer: AC 这道题我不知该如何去分析它。

解决方案 »

  1.   

    C 就很简单  因为要输出8个数 从0开始 那就是0, 2, 4, 6, 8, 10, 12, 14, 
    应为不管是那个线程怎么交替输出来的,但统一的思想 不官司谁做 都会输出 都会改变 x的值
    每个都要输出4次 线程才能结束但由于不是同步的 可能有时第二个线程 做完 current=x;就要输出但停了 
    第一个线程有吧 以前的值突然做current=x;(假设第一个快,那这时做过了x=current+2)
    就会出项某个值漏掉了 
    或是第一输出完就停了  第二个也恰好输出 就会把某个数输出2次但
    current 和 x 最多只会相差2 怎么会有10,过了又 6,的 
    只能在看看了
      

  2.   

    哦 貌似我看错了 不好意思 
    current 不是两个线程共享的 那这个就有可能了 
    线程又不同步 结果会很有凑巧性A.  0, 2, 4, 4, 6, 8, 10, 6,
    红色的为第一个线程 最后个6是就在System.out.print(current+", ");没做换了
    第二个一次性做完 4, 6, 8, 10,
    C.    0, 2, 4, 6, 8, 10, 12, 14,
    红色的为第一个线程 这是分开一次性做完
        
      

  3.   

       每个线程会在for中进行4次循环,所以,打印出的数字应当是2*4=8个,排除D、E。
       可以看出在go()方法中new出来的两个线程中,变量x是共享的,而current不是共享的,即current在两个线程中各自有单独的一份。而各自单独的current又是由线程共享的x赋值的。
       打印出来的结果应当是可以分为4个一组(共两组,由两个线程分别完成),公差为2的数列才是可能的。
      如(KindAzrael所述):A。 0, 2, 4, 4, 6, 8, 10, 6, 
        分为:0,2,4,6,和4,6,8,10两组
       C.  0, 2, 4, 6, 8, 10, 12, 14, 
        分为: 0, 2, 4, 6,和8, 10, 12, 14,两组
       而B不可以。
       
      

  4.   

    明白了,关键就在于current是local的,保证了,每个线程输出的x都是相差为2的。