2012-02-08 9 views
1

私はそれが仕事だと思うようにEDIT 同期は参照/ポインタ変数で動作しますか?

(すなわち、2つのスレッドが追加または除去しながらお互いのつま先を踏まないであろう)

public MyClass myClass = new MyClass(); 
public MyClass2 myClass2 = new MyClass2(); 

public class MyClass { 
    private ArrayList<String> myString = new ArrayList<String>(); 

    public ArrayList<String> GetArrayList() { 
     return myString; 
    } 
    public MyClass() { 
      new Thread(new Runnable { 
       public void run() { 
        synchronized(myString) { 
         /* add or remove myString elements */ 
        } 
       } 
      }).start(); 
    } 

} 


public class MyClass2 { 
    // Pointer to myString 
    ArrayList<String> refString; 
    public MyClass2() { 
      refString = myClass.GetArrayList(); 
      new Thread(new Runnable { 
       public void run() { 
        synchronized(refString) { 
         /* add or remove refString elements */ 
        } 
       } 
      }).start(); 
    } 
    } 
} 
を、私は一般的にキーワード作品を同期させる方法を知っているが、以下の作業を希望:i「は、次回これをeclipseで入力して&ペーストをコピーしてください:

+0

同期しようとしているものは明確ではありません。 – kosa

+0

両方のスレッドが要素を追加/削除するので、私はmyStringを同期しようとしていました。 – broody

答えて

2

でも、Collections.synchronizedList(new ArrayList)を使うのはなぜですか?

あなたがしているのは、あなたが必要としているすべてのものをチェックし、削除しないでください(例えば、!myList.contains {myList.add}ならば)、あなたはコードを同期化されたブロック

+0

ありがとうございました! NewKnowledge ++ – broody

1

はい、これはうまくいきます。同じオブジェクトへの参照を扱うので、同じオブジェクトがロックされ、​​ステートメントでテストされます。

0

最初に、同期ブロックはオブジェクトで動作します。クリティカルセクションを同期するためにオブジェクトを使用している場合は、動作します。しかし、あなたはmyClass2コンストラクタ内で何をしましたか?あなたはmyClass2コンストラクタを有効なコードではないmyClassコンストラクタの中に定義しています。

+0

ええ、ブラウザで直接入力するので、構文がオフになることがありますが、myClassは一番上に定義されています。 – broody

関連する問題