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() 在启动新线程后仍然可以改变可变对象的状态。在这里确保线程安全的首选方法是什么?将 MutableObject 传递给 ObjectB 时是否应该复制它?可变对象是否应确保内部正确同步?我以前曾多次遇到过这种情况,尤其是在尝试在许多 GUI 应用程序中使用 SwingWorker 时。我通常会尝试确保仅将不可变对象引用传递给将在另一个线程中使用它们的类,但有时这可能很困难。