如果此方法的變量'commonSet'是類級別字段,下面的代碼是否會導致相同的問題?如果它是一個類級別的字段,那麼我將不得不包裝添加到在同步塊內設置操作,因爲HashSet不是線程安全的。我應該在下面的代碼中做同樣的事情,因爲多個線程正在添加到集合中,甚至當前線程可能會繼續對集合進行變異。線程安全 - 最終本地方法變量傳遞給線程?
public void threadCreatorFunction(final String[] args) {
final Set<String> commonSet = new HashSet<String>();
final Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
commonSet.add(newValue());
}
}
};
new Thread(runnable, "T_A").start();
new Thread(runnable, "T_B").start();
}
對'commonSet'的引用是通過使用final來鎖定的。但是在它上面運行的多個線程仍然會破壞集合中的值(它可能包含重複項?)。其次,混淆是因爲'commonSet'是一個方法級變量 - 它的調用方法(threadCreatorFunction)和堆棧內存的運行方法的堆棧內存是相同的引用 - 這是正確的嗎?
有與此相關的不少問題:
- Why do variables passed to runnable need to be final?
- Why are only final variables accessible in anonymous class?
但是,我看不到他們強調這種共享/傳遞mutables的線程安全的一部分。
另請參閱http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen – nos 2012-08-06 07:45:36