Verwendung von ThreadLocal

8

Was ist der typische Einsatz von ThreadLocal in Java? Wann benutzt man es? Ich konnte keine Bewerbungsdetails aus diesem Artikel zu java docs finden.

    
Noriyasu 18.10.2010, 07:01
quelle

4 Antworten

5

Ich würde sagen, dass die typischste ThreadLocal-Verwendung ist, wenn Sie ein Objekt haben, auf das überall in einem Fluss zugegriffen werden muss, und Sie nicht den Verweis auf dieses Objekt über alle Ebenen weitergeben möchten. Etwas wie Singleton-Muster, aber pro Thread.

Die Beispiele sind DB-Verbindung, Hibernate-Sitzung usw. Sie öffnen sie irgendwo am Anfang Ihres Flusses, commit / close am Ende des Flusses und verwenden Sie überall während des Flusses.

    
AlexR 18.10.2010 10:17
quelle
4

Dies ist der Fall, wenn Sie Objekte verwenden möchten, die nicht threadsicher sind, aber den Zugriff auf diese nicht synchronisieren möchten (aus Leistungsgründen). Sie erstellen mehr oder weniger einen Accessor für das Objekt, das Sie mehrmals verwenden müssen, damit Sie sicherstellen, dass jeder Thread, der diesen Accessor aufrufen kann, einen anderen, nicht verwendeten, erhält. Eine sehr typische Verwendung ist die Verwendung von SimpleDateFormat, einer Klasse, die, wenn sie threadsicher wäre, Ihre Instanz als statisch deklarieren würde, um dieselbe Instanz wiederzuverwenden.

Hier ist ein guter Artikel, der es beschreibt: Dr. Dobbs: Thread-lokale Variablen in Java verwenden

    
Victor Jalencas 18.10.2010 07:08
quelle
4

Vielleicht kann ein anschaulicheres Beispiel für Sie gut sein:

%Vor%

Solche Situationen treten zum Beispiel in mehrschichtigen Architekturen auf (UI-Aufrufe Remote-Fassade, Remote-Fassadenaufruf-Anwendungsschicht, Anwendungsschicht-Rufe-Domänenschicht, Persistenzschicht der Domänenschichtaufrufe, ...) Wenn diese Methoden () zu verschiedenen Klassen gehören Es gibt keinen guten Weg, um solche Daten zu übergeben, außer das Hinzufügen eines zusätzlichen Parameters 'Somedata' für die meisten Methoden in unserem Code, dies bricht zB das Open-Closed-Prinzip. Die Lösung für dieses Problem ist ThreadLocal:

%Vor%     
iirekm 18.10.2010 08:13
quelle
0

Wenn Ihr Flow an einen Thread gebunden ist, wie AlexR erwähnt, können Sie eine public final class C mit einer private static final ThreadLocal<T> p -Eigenschaft erstellen, fügen Sie Accessor-Methoden hinzu. Dann können Sie p.set (), p.remove () und p.get () jeweils in Ihrem Flow verwenden.

%Vor%     
egallardo 25.10.2013 15:00
quelle

Tags und Links