我有以下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
答案 0 :(得分:2)
run
方法有一个for
循环,执行4次并每次打印一些内容。当你运行2个线程时,你最终应该打印8个东西,所以答案D和E是不可能的。
至于显示的内容,您需要看到a
已共享,并记住线程并行运行:来自线程1的run
可能完全运行,然后{{1线程2完全运行,或者它们混淆了。在后一种情况下,线程1可能在run
循环内部打印某些东西,然后不是执行for
而是切换到线程2并再次打印相同的数字。
答案A是可能的:线程1在+2
循环中启动并执行current = a;
,因此for
等于current
且0
没有被修改了。然后线程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,