4

鉴于:

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();
}

}

哪两个是可能的结果?(选择两个)

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,

我选择了 A 和 B,但我不确定这是否是正确的答案。

4

2 回答 2

3

首先 D. 和 E. 出局了。作为i函数的本地范围,我们知道将有 8 个数字。

现在

B. 0, 2, 4, 6, 8, 10, 2, 4,

是不正确的。为什么?为了打印最后两个位置,每个线程必须至少写入变量两次。x此时 的最小值x4。这意味着无论竞争条件如何,最后两个值都应该大于或等于4.

编辑 C是完全可能的。没有同步并不意味着不可能有所谓的串行执行(即好像线程一个接一个地执行)。并发的教训是你不知道线程将如何交错

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

例如发生:

  • 当第一个线程x在第二个开始之前完成更新时
  • 当第一个线程在第一个线程之前挂起时,第二个线程current = x;完成执行,第一个线程继续。
  • 大量其他案例。

正如布赖恩·戈茨所说:

“编写正确的程序很难;编写正确的并发程序更难。”

于 2012-09-02T21:51:31.190 回答
0

答案是 A 和 C。您可以立即消除 D 和 E,因为两个线程都会显示 4 个结果,所以总共有 8 个结果,只剩下 A、B 和 C。

B 被消除是因为两个 2 之间的序列太长,单个线程无法产生,所以两个线程必须完成比仅达到 2 更多的工作。

于 2012-09-02T21:59:55.580 回答