public class ObjectA {
private void foo() {
MutableObject mo = new MutableObject();
Runnable objectB = new ObjectB(mo);
new Thread(objectB).start();
}
}
public class ObjectB implements Runnable {
private MutableObject mo;
public ObjectB(MutableObject mo) {
this.mo = mo;
}
public void run() {
//read some field from mo
}
}
上記のコードサンプルからわかるように、Runnableを実装し、別のスレッドで可変オブジェクトを使用するクラスに可変オブジェクトを渡します。ObjectA.foo()は、新しいスレッドの開始後も可変オブジェクトの状態を変更できるため、これは危険です。ここでスレッドセーフを確保するための好ましい方法は何ですか?ObjectBに渡すときにMutableObjectのコピーを作成する必要がありますか?可変オブジェクトは内部で適切な同期を保証する必要がありますか?私はこれまで何度もこれに遭遇しました。特に、多くのGUIアプリケーションでSwingWorkerを使用しようとしたときです。私は通常、不変のオブジェクト参照のみが別のスレッドでそれらを使用するクラスに渡されるように努めますが、これが難しい場合もあります。