1

私には2つの状況があります:

状況 1: doSomething() メソッドを持つクラスの 1 つのインスタンスを共有する 2 つのスレッドがあります。状況 2: 2 つのスレッドがあり、それぞれに doSomething() メソッドを持つクラスのインスタンスが 1 つあります。

void doSomething() {
    for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName());
        }

2 つのスレッドが開始すると、両方とも doSomething() を呼び出します。出力を見てください。状況 1 と 2 の違いがわかりません。

2 つのスレッド (スレッド A と B ) の出力は次のようになります: AAAABBBAABBBB ....

状況 1 と状況 2 の同時実行の違いを教えてください。どうもありがとう!

4

4 に答える 4

1

上記のような状況では、操作は状態変数 (インスタンス変数) に影響を与えないため、違いを確認することはできません。次のような方法を試してください。

class C {
 int i = 0;
 synchronized void doSomething() {
  while(i < 20) {
   System.out.println( Thread.currentThread().getName() + " : Value for i=" + i );
   i++;
  }
 }
}

2 つの個別のオブジェクトを使用して上記を実行すると、各スレッドは 20 個の値 (0 から 19) を出力します。同じオブジェクトを共有する 2 つのスレッドを使用して上記を実行すると、2 つのスレッド全体で 20 個の値が出力されますが、どのスレッドが値をインクリメントするか予測できないため、どのスレッドがどの値を出力するかは不明iです。

于 2013-04-29T15:19:45.567 に答える
1

スレッドが実行中のオブジェクトのメンバー データにスレッドがアクセスしている場合、2 つの状況に違いがあるだけです。

2 つのスレッドと 2 つのオブジェクトがあり、両方が独立して実行されていることがわかります。

2 つのスレッドと 1 つのオブジェクトを使用すると、それらが互いに干渉し合い、メンバー変数内の互いの値を上書きすることがわかります。これは競合状態として知られており、断続的であるため、見つけてデバッグするのは非常に困難です。変数を共有する 2 つのスレッドを処理することが、セマフォやロック ステートメントなどの存在理由です。

于 2013-04-29T15:20:26.733 に答える
0

違いはありません。

キーワードを除いてsynchronized、スレッドはインスタンスを気にしません。

于 2013-04-29T15:17:58.600 に答える
0

ご想像のとおり、同時実行性の観点からは違いはありません。

于 2013-04-29T15:18:24.467 に答える