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(){
           Runnable rl = new Runner(); 
           new Thread(r1).start();
           new Thread(r1).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,
答案:AC为什么会有AC两个结果

解决方案 »

  1.   

    首先,i是0-4也就是说每个线程执行4次,两个线程是8次,所以那些打出不是8个数的,排除,只剩A,B,C
    其次,两个线程都能改变X的值,比如线程1正好把X加到4,线程2刚好开始执行,那么他得到的X的初始值为4,而不是0,此时有一个特点两个线程都会打出这个数(线程2刚开始执行时打出的第一个数,线程1正好执行到这个数),些时正好是A选项。
    但是有一个例外,就是线程1执行完了,才开始执行线程2,那就没有重合点了,就是答案C。B不合逻辑。
    其中A答案中前三个数(0,2,4)和最后一个数(6)是线程1打的,中间的(4,6,8,10)是线程2打的。
    C答案前四个数是线程1打的,后四个数是线程2打的。你可以通过加标记的方式来验证,到底是哪个线程打的。
      

  2.   

    因为2个线程同时修改了全局变量x的值。
    如果线程是顺序执行的话,结果应是
    0,2,4,6
    0,2,4,6
    但是这里是并发执行的,且输出的数肯定为8个。先排除D,E
    下面根据线程运行的顺序不同来推出答案,设2个线程为A,B
    A 0 2 4        6
    B     4 6 8 10
    这就是A答案,在线程A运行到i = 2时,此时线程A中的current = 4,全局变量x = 4,运行至x = current + 2前,线程B开始运行,由于x = 4,所以线程B的current = 4,线程B比线程A先执行完,输出4,6,8,10.
    然后线程A运行到x = current + 2,由于线程A的current还是4,所以x = 6,最后一次循环输出6.C答案很好推出,就是2个线程串行执行。至于B答案排除的原因是,由于已经输出了0,2,4,6,8,10.最有可能符合答案的情况是,一个线程A输出了0,2,另一个线程B输出了4,6,8,10结束,然后没结束的线程A继续跑,此时线程A中current = 2,再运行x = current + 2 ,x= 4,所以最后不可能输出2,4.故排除。