2012-05-15 9 views
5

definiert eine threadlocal Variable in einer Klasse, um einige Instanzen zu verwalten. Einstellung und Einstieg in eine rekursive Methode. Irgendwie kann ich die threadlokale Variable nicht löschen, wenn die Anfrage abgeschlossen ist (ich habe auf andere Weise analysiert. Ich kann threadlocal nicht löschen).Wenn ThreadLocal-Variable nicht gelöscht wird, was wird passieren?

Meine Frage ist, wenn ich threadlocal Variable für jede Anfrage nicht löschte, was wird passieren? Was sind die Auswirkungen?

Antwort

2

Wenn der Thread stirbt, wird auch der Verweis auf den ThreadLocal-Eintrag und so Ihr Objekt (vorausgesetzt, es gibt keine anderen Referenzen) wird Müll gesammelt werden.

Solange der Thread lebt, so auch Ihr Objekt.

Sie müssen beurteilen, welche Auswirkungen Ihr Objekt auf Langlebigkeit hat.

+0

Dank Bohemian für Ihre Antwort. Also, während ich eine nächste Anfrage, werde ich nicht die alten Werte von threadlocal (der vorherigen Anfrage) .. Ritus? – Shahul

+0

Ja, ich denke du wirst, da Server dazu neigen, Threads wiederzuverwenden. – keuleJ

0

Sie haben ein Speicherleck und das ThreadLocal ist möglicherweise bereits beim nächsten Aufruf des Codes gesetzt. ThreadLocals sind ein bisschen wie ein Code-Geruchs-Imo.

9

Die javadoc sagt:

, nachdem ein Thread weggeht, werden alle seine Kopien von lokalen Thread-Instanzen zu Garbage Collection unterliegen (sofern keine anderen Verweise auf diese Kopien vorhanden sind).

Zum Beispiel the implementation hier wird von einem HashTable gesichert, die weak references für den Schlüssel verwendet. In diesem Fall ist der Schlüssel der Thread. Wenn der Thread beendet wird, wird der Eintrag in der Map für die Garbage Collection verfügbar.

Die Speicherbereinigung kann nur auftreten, wenn das System nicht mehr genügend Speicherplatz zur Verfügung hat. Diese Überlegung gilt jedoch für alle Objekte im System: Wann Objekte zurückgewonnen werden, hängt von der GC-Richtlinie ab, die VM-spezifisch ist und der Feinabstimmung unterliegt.

Dies ist meiner Ansicht nach der guten und schlechten Nutzung von Thread Einheimischen:

  • Es ist gut ot Verwendung Thread Einheimischen, wenn der Punkt eine Gleichzeitigkeit Problem zu beheben ist. Zum Beispiel, Vermeidung der Synchronisation von an object that is not thread-safe by keeping one copy per thread. Oder um andere Probleme im Zusammenhang mit Concurrency anzugehen.

  • Es ist ist schlecht wenn der Punkt ist, "einen Parameter" in der Rufkette in einer billigen Weise zu übergeben. Sie sollten Ihren Code besser umgestalten und das Objekt als regulären Methodenparameter in der Aufrufkette weiterleiten.

  • Es ist in Ordnung zu Thread lokalen verwenden, um irgendeine Form von "aktuellen" Kontext, z. die aktuelle Anfrage

Verwandte Themen