2012-05-10 10 views
0

オブジェクトの構築はJavaのThreadSafeにありますか?以下のコードスニペットを参照してください。オブジェクトの構築がアトミックかどうか

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

    obj.setState(XYZ); 

} 

次に、どこかの50スレッドがABCClassオブジェクトを同時に解釈しています。私たちはSomeOtherClassオブジェクトの状態を変更しています。

私の質問は、これはすべてのABCClassのインスタンス間で共有されているように、この建設プロセスはアトミックであるか、スレッドはSomeOtherClassオブジェクトの古くなった状態を見ることになります。

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

}

+0

あなた宣言 '' obj'程度ABCClassのパラメータが、どのようとしてob'。私に 'obj'の宣言を見せてください。 – nnhthuan

+0

@ LukasEder:これは単なるケースです。 – amicngh

+0

@nnhthuan:申し訳ありませんが、誤植です。彼らは同じです – amicngh

答えて

0

オブジェクトは、各スレッドのコンテキストで作成され、それは、アトミックになり、無スレッドが他のスレッドの状態を見ることができないので、副作用ないが、オブジェクト/ instanceVariable(静的)を、スレッド間で共有されている場合

+0

建設は原子的な操作ではないと言うのですか? – amicngh

0

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

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

あなたSomeOtherClassのオブジェクトがABCClassの内側にあり、それが静的である場合、それはhere

0

、あなたは、この静的オブジェクトで同期することができます詳細についてはこちらをご覧ください。

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

1

私は構築プロセスが原子的ではないと思っています,,,メモリ割り当てと初期化は複合的な動作です。また、オブジェクトを構築するオブジェクトOBJを50スレッドとすると、obj.setState(XYZ)メソッドはスレッドセーフでなければなりません。

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); 
    } 
} 
+0

私の質問は、建設プロセスが原子であるかどうかですか? – amicngh

+0

いいえ、構築プロセスはアトミックではありません。実際には、そのまさにその概念はあまり定義されていません。 JavaのすべてのコンストラクタがJVMグローバルロックを求めて競合しているかのような効果があることを意味していますか? –

+0

いいえ、オブジェクトがまだ作成されていない場合は、スレッドには表示されません。 – amicngh

関連する問題