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

}

考えられる結果はどれですか?(2つ選択してください)

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,

間違っている。なんで?最後の2つの位置を出力するには、各スレッドが変数を少なくとも2回書き込む必要があります。xこの時点での最小値はxです4。つまり、競合状態に関係なく、最後の2つの値は。以上である必要があります4

編集 Cは完全に可能です。同期がないからといって、いわゆるシリアル実行ができないわけではありません(つまり、スレッドが次々に実行されるかのように)。並行性からの教訓は、スレッドがどのようにインターリーブされるかわからないということです

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

たとえば:

  • x2番目の開始前に更新を終了する時間としての最初のスレッド
  • 最初のスレッドが最初のスレッドの前に中断されるcurrent = x;と、2番目のスレッドは実行を終了し、最初のスレッドは続行します。
  • の多くの場合。

ブライアンゲッツが言ったように:

「正しいプログラムを書くのは難しい。正しい並行プログラムを書くのは難しい。」

于 2012-09-02T21:51:31.190 に答える
0

答えはAとCです。両方のスレッドが4つの結果を表示するため、DとEをすぐに削除できます。したがって、合計8つの結果が表示され、A、B、Cのみが残ります。

2つの2の間のシーケンスが長すぎて、1つのスレッドを生成できないため、Bが削除されます。したがって、両方のスレッドが2に到達するよりも多くの作業を実行したに違いありません。

于 2012-09-02T21:59:55.580 に答える