我發現我經常做下面的事情。製作要發送到線程的對象的副本。該線程是唯一一個使用該對象,我們有一個前發生的關係,因此它是線程安全的。在Java中傳遞本地對象線程壞風格?
但這讓我覺得感覺緊張。正如評論所述,如果有人出現並且用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
}
}
我看不出有什麼不妥。 'objForThread'可以訪問的範圍非常小。 – millimoose 2013-02-08 22:56:45
您的疑慮是有效的。將可變對象傳入線程是很危險的。有一件事要考慮的是將它傳遞給一個類構造函數,至少你會很容易地看到線程正在使用它。複製構造函數還允許線程擁有它自己的對象副本。 – Gray 2013-02-08 22:57:18
這很好,如果'objForThread'是線程安全的,或者更經常的,不可變的。 – 2013-02-08 22:58:21