我发现我经常做以下事情。复制对象以发送到线程。线程是唯一使用过该对象的线程,并且我们具有事前发生的关系,因此它是线程安全的。
但这让我感到紧张。如评论所述,如果有人出现并用objForThread欺骗了该怎么办?
我应该使用锁吗?还是这是一种普遍接受的Java模式?
class Example
{
private SomeObj mDynamicObj = new SomeObj();
public void doWorkInAThread()
{
mutateThis(mDynamicObj);
final SomeObj objForThread = new SomeObj(mDynamicObj);
myExecutorService.submit(new Runnable() { @Override public void run()
{
doSomethingWith(objForThread);
}});
mutateThis(mDynamicObj);
// Concerned that in the future someone will come
// along and mutate objForThread here making this thread unsafe
}
}
最佳答案
如果您感到紧张,则最好将引用传递给线程,而不要将其保持在本地:
class Example
{
private SomeObj mDynamicObj = new SomeObj ();
public void doWorkInAThread ()
{
class MyRunnable implements Runnable
{
private final SomeObj objForThread;
public MyRunnable (SomeObj objForThread)
{
this.objForThread = objForThread;
}
@Override
public void run ()
{
doSomethingWith (objForThread);
}
}
mutateThis (mDynamicObj);
myExecutorService.submit (new MyRunnable (new SomeObj (mDynamicObj)));
mutateThis (mDynamicObj);
}
}