两个线程作用于同一个runnable

时间:2012-09-02 21:35:59

标签: java concurrency race-condition

假设:

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,但我不确定这是否是正确答案。

2 个答案:

答案 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。