假设:
public class Thread1 {
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 void go() {
Runnable r1 = new Runner();
new Thread(r1).start();
new Thread(r1).start();
}
public static void main(String[] args) {
new Thread1().go();
}
}
哪两个可能的结果? (选择两项)
一个。 0,2,4,4,6,8,10,6,
B中。 0,2,4,6,8,10,2,4,
℃。 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,
电子。 0,2,4,6,8,10,12,14,0,2,4,6,8,10,12,14,
我选择了A和B,但我不确定这是否是正确答案。
答案 0 :(得分:3)
首先,D.和E.出局了。作为函数本地的i
范围,我们知道将有8个数字。
现在
B. 0, 2, 4, 6, 8, 10, 2, 4,
不正确。为什么?为了打印最后两个位置,每个线程必须 写 变量x
至少两次。此时x
的最小值为4
。这意味着无论竞争条件如何,最后两个值应大于或等于4
。
修改强> 的
C
完全有可能。没有同步并不意味着不可能拥有所谓的串行执行(即,如果线程一个接一个地执行)。并发的教训是你不知道线程将如何交错
C. 0, 2, 4, 6, 8, 10, 12, 14,
例如:
x
时current = x;
之前暂停,第二个完成执行并且第一个完成后继续。正如Brian Goetz所说:
“编写正确的程序很难;编写正确的并发程序更难。”
答案 1 :(得分:0)
答案是A和C.您可以立即消除D和E,因为两个线程将显示4个结果,因此总共8个结果,只留下A,B和B。在场比赛。
B被删除了,因为两个2之间的序列对于单个线程来说太长了,所以两个线程必须完成更多工作而不是仅仅达到2。