Verursacht der folgende Code die gleichen Probleme, wenn die Variable 'commonSet' dieser Methode stattdessen ein Feld auf Klassenebene ist. Wenn es sich um ein Feld auf Klassenebene handelt, muss das Hinzufügen zum Set-Vorgang innerhalb eines synchronisierten Blocks erfolgen, da HashSet nicht Thread-sicher ist. Sollte ich das gleiche im folgenden Code tun, da mehrere Threads zum Set hinzufügen oder sogar der aktuelle Thread fortfahren könnte, das Set zu mutieren.Thread Safe - letzte lokale Methodenvariable, die an Threads weitergegeben wurde?
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();
}
Der Verweis auf 'commonSet' 'verschlossen' durch endgültige Verwendung. Aber mehrere Threads, die darauf ausgeführt werden, können die Werte in der Gruppe immer noch beschädigen (sie können Duplikate enthalten?). Zweitens, Verwirrung ist seit "commonSet" ia eine Methode Level-Variable - es ist die gleiche Referenz wird auf dem Stapelspeicher der aufrufenden Methode (threadCreatorFunction) und Stapelspeicher der Lauf-Methoden - ist das korrekt?
Es gibt durchaus ein paar Fragen im Zusammenhang mit diesem:
- Why do variables passed to runnable need to be final?
- Why are only final variables accessible in anonymous class?
Aber ich sie nicht auf Thread-sicher Teil eines solchen Austausch/Weitergabe von mutables betonte sehen kann.
Siehe auch http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen – nos