为什么两个线程产生低于结果(ocjp测试)?

时间:2016-05-11 08:31:33

标签: java

我有以下ocjp测试,我不明白答案(因为我认为答案应该是A + D,但正确的答案是A + B),任何人都可以解释一下?:

  

给出一段代码。哪两个可能的结果? (选择两个)

public class Cruiser {
    private int a = 0;

    public void foo() {
        Runnable r = new LittleCruiser();
        new Thread(r).start();
        new Thread(r).start();
    }

    public static void main(String arg[]) {
        Cruiser c = new Cruiser();
        c.foo();
    }

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

A)0,2,4,0,2,4,6,6,
B)0,2,4,6,8,10,12,14,C)0 ,2,   4,6,8,10,2,4,
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,

答案:A,B

2 个答案:

答案 0 :(得分:2)

run方法有一个for循环,执行4次并每次打印一些内容。当你运行2个线程时,你最终应该打印8个东西,所以答案D和E是不可能的。

至于显示的内容,您需要看到a已共享,并记住线程并行运行:来自线程1的run可能完全运行,然后{{1线程2完全运行,或者它们混淆了。在后一种情况下,线程1可能在run循环内部打印某些东西,然后不是执行for而是切换到线程2并再次打印相同的数字。

答案A是可能的:线程1在+2循环中启动并执行current = a;,因此for等于current0没有被修改了。然后线程2启动并执行a 3次,从而打印for。我们说它也将0, 2, 4,设置为a。然后我们回到线程1继续其6等于current,并且它有时间打印3次,从而打印0。它还将0, 2, 4,设置为a。然后我们回到获得6并打印它的线程2,即'6',然后我们回到线程a a`并打印它,即'6'。

答案B是可能的:因为ex线程1完全运行然后线程2.或者线程混合但不是太多,例如每个线程有时间在上下文之前执行that also gets循环内的3行切换到另一个线程。

答案C不可能:如果您执行for,则只能返回上一个号码。当您返回current = a时,表示线程1已打印2,然后执行0,然后+2。然后线程2完全运行并打印current = a。然后线程1返回打印2, 4, 6, 8。我无法打印2然后返回10(您可以回到2)。

答案 1 :(得分:1)

它是因为private int a = 0;它在两个线程中共享。因此两个线程同时与此变量交互。 以下情况可能会发生:

0,2,4,6,8,10,12,14

0,0,2,4,2,6,4,6,

0,2,4,6,0,2,4,6,