0

オブジェクトの構築は Java ThreadSafe ですか?次のコード スニペットを参照してください。

//We have some peace of code
public ABCClass(SomeOtherClass obj) {

    obj.setState(XYZ);

}

次に、どこかで 50 のスレッドが同時に ABCClass オブジェクトを構築しています。構築中に、SomeOtherClass のオブジェクトの状態を変更しています。

私の質問は、この構築プロセスがアトミックであるか、すべての ABCClass のインスタンス間で共有されているため、スレッドが SomeOtherClass のオブジェクトの古い状態を確認することです。

編集: obj オブジェクトはすべてのコンストラクターで共有されています。

class SomeOtherClass{

private Status state;

public void setState(Status st){

    this.state=st;
}   

} 
//  Test Class
class TestClass{

public static void main(String[] args) {

    final SomeOtherClass smc=new SomeOtherClass();

    for(int i=0;i<50;i++)
    {
        new Thread(new Runnable() {

            @Override
            public void run() {
                new ABCClass(smc);

            }
        }).start();
    }
}

}

4

5 に答える 5

2

あなたの問題はコンストラクターとは何の関係もありませんが、それをSomeOtherClass objスレッド間で共有し、同時に変更することとは関係ありません-そしてそれは同時実行の問題です。このオブジェクトのすべての変更がスレッドセーフであることを確認する必要があります。

アップデート

以下のコメントからポイントを証明するコード:

public class Test {
  static Test t1;
  public Test() {
    System.out.println("Constructing Test");
    t1 = this;
    try { Thread.sleep(2000); } catch (Exception e) {}
    System.out.println("Almost done");
  }
  public static void main(String[] args) throws InterruptedException {
    new Thread() { public void run() { new Test(); }}.start();
    Thread.sleep(1000);
    System.out.println(t1);
  }
}
于 2012-05-10T09:10:48.750 に答える
1

構築プロセスはアトミックではないと思います、、、、メモリの割り当てと初期化は複合アクションです。また、たとえば50スレッドでオブジェクトを構築するために同じオブジェクトOBJを渡す場合、メソッドobj.setState(XYZ)はスレッドセーフである必要があります...これですべてを確認できます。

于 2012-05-10T08:58:10.033 に答える
0

オブジェクトは各スレッドのコンテキストで作成され、アトミックになります。スレッドは他のスレッドの状態を見ることができないため、副作用はありませんが、オブジェクト/instanceVariable(static) がスレッド間で共有されている場合は、同時実行制御を提供する必要がある場合があります

于 2012-05-10T08:42:43.757 に答える
0

各スレッドが新しいオブジェクトを作成し、その状態を変更している場合、各スレッドには独自の処理対象のオブジェクトがあるため、同時実行性は問題になりません。

1 つのオブジェクトが複数のスレッドによって変更されている場合、問題が発生します。このような場合、共有オブジェクトに同期してアクセスする方法を提供する必要があります。

詳しくはこちら

于 2012-05-10T08:52:10.633 に答える
0

SomeOtherClass のオブジェクトが ABCClass 内にあり、それが静的である場合、この静的オブジェクトで同期できます。

SomeOtherClass のオブジェクトが ABCClass 内にあり、静的ではない場合、各オブジェクトは 1 回だけインスタンス化されるため、同期は気にしません。つまり、ABCClass のオブジェクトに対して 1 回だけ構築が呼び出されることを意味します。

于 2012-05-10T08:55:37.660 に答える