Überblick über ThreadLocal in Java
ThreadLocal
ist ein leistungsstarkes Tool in der Java-Sprache, das es Entwicklern ermöglicht, Variablen zu erstellen, die für jeden Ausführungs-Thread spezifisch sind. Das bedeutet, dass jeder Thread seine Kopie der Variablen hat, unabhängig von den Werten derselben Variablen in anderen Threads.
Dies ist besonders nützlich in Multithread-Anwendungen, wo verschiedene Threads unterschiedliche Anforderungen an eine bestimmte Variable haben können und wo Änderungen am Wert einer Variablen in einem Thread den Wert derselben Variablen in einem anderen Thread nicht beeinflussen sollten.
Hauptverwendung der Variablen ThreadLocal
Der Hauptanwendungsfall für ThreadLocal
besteht darin, einen Status pro Thread zu speichern, z. B. eine Benutzer-ID oder Transaktions-ID, die für eine einzelne Anfrage spezifisch ist und nicht zwischen verschiedenen Anfragen geteilt werden sollte.
Stellen Sie sich beispielsweise eine Webanwendung vor, die eine einzelne Datenbankverbindung verwendet, um mehrere Benutzeranforderungen zu verarbeiten. Ohne ThreadLocal
wäre es schwierig sicherzustellen, dass jede Anfrage die richtigen Benutzerinformationen verwendet, da mehrere Anfragen gleichzeitig von verschiedenen Threads ausgeführt werden und sich gegenseitig stören könnten.
Mit ThreadLocal
kann jeder Thread seine Benutzerinformationen speichern, die von der diesem Thread zugeordneten Datenbankverbindung verwendet werden.
um ein ThreadLocal
in Java zu verwenden
Um ThreadLocal
in Java zu verwenden, deklarieren Sie eine neue Instanz der ThreadLocal
-Klasse und verwenden dann ihre get()
- und set()
-Methoden, um auf den mit dem aktuellen Thread verknüpften Wert zuzugreifen und ihn zu ändern.
Der folgende Code demonstriert beispielsweise die Verwendung von ThreadLocal
, um eine Benutzer-ID für jeden Thread zu speichern.
public class Main {
public static void main(String args[]) {
ThreadLocal<Integer> localVariable = new ThreadLocal<>();
localVariable.set(10);
// get the value for the current thread
System.out.println("Value of localVariable in current thread: " + localVariable.get());
}
}
Wenn Sie eine ThreadLocal
-Variable erstellen, hat jeder Thread, der darauf zugreift, eine separate Instanz der Variablen. Dies bedeutet, dass jeder Thread einen anderen Wert für dieselbe ThreadLocal
-Variable speichern kann, und wenn er auf die Variable zugreift, erhält er den für diesen spezifischen Thread festgelegten Wert.
Dies kann in Umgebungen mit mehreren Threads nützlich sein, in denen Sie Thread-spezifische Daten speichern müssen, die nicht von Threads gemeinsam genutzt werden sollten.
Beispielsweise können Sie eine ThreadLocal
-Variable verwenden, um Informationen wie die Benutzer-ID oder die Transaktions-ID für einen bestimmten Thread zu speichern, um die Daten für diesen Thread zu verfolgen, selbst wenn mehrere Threads gleichzeitig ausgeführt werden.
Es ist wichtig zu beachten, dass ThreadLocal
seinen Wert nicht automatisch entfernt, wenn der Thread, der es erstellt hat, beendet wird. Dies kann zu Speicherlecks führen, da die den beendeten Threads zugeordneten Werte weiterhin Speicher belegen.
Es wird empfohlen, die remove()
-Methode der ThreadLocal
-Klasse oder die try-with-resources-Anweisung in Java 7 und höher zu verwenden, um dies zu vermeiden. Zum Beispiel:
try (ThreadLocalCleanup cleanup = new ThreadLocalCleanup(userId)) {
// use the ThreadLocal variable here
}
In diesem Beispiel implementiert die Klasse ThreadLocalCleanup
die Schnittstelle AutoCloseable
, wodurch sie mit der try-with-resources-Anweisung verwendet werden kann.
Beim Verlassen der try-with-resources-Anweisung wird automatisch die close()
-Methode der ThreadLocalCleanup
-Klasse aufgerufen, die den dem aktuellen Thread zugeordneten Wert aus der ThreadLocal
-Variablen entfernt.
Klicken Sie hier, um die Funktion des oben genannten Codes zu überprüfen.
Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.
Facebook