In diesem Artikel erfahren Sie, was ThreadLocal ist. Die Prinzipanalyse von ThreadLocal hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen.
1. Was ist ThreadLocal?
ThreadLocal stellt Thread-lokale Variablen bereit. Diese Variablen unterscheiden sich von gewöhnlichen Variablen darin, dass jeder Thread, der auf eine solche Variable zugreift (über seine get- oder set-Methode), über eine eigene, unabhängig initialisierte Kopie der Variablen verfügt.
ThreadLocal-Instanzen sind normalerweise private statische Felder von Klassen, die einen Status einem Thread zuordnen möchten (z. B. Benutzer-ID oder Transaktions-ID usw.).
(Voice-over: Diese Passage drückt drei Bedeutungen aus
1. ThreadLocal ist ein Variablentyp, den wir „lokale Thread-Variablen“ nennen.
2. Jeder Thread wird Erstellen Sie eine Kopie der Variablen, wenn Sie darauf zugreifen.
3. Variablen vom Typ ThreadLocal werden im Folgenden im Allgemeinen mit privater Statik geändert Beispielsweise generiert diese Klasse eine eindeutige Kennung für jeden Thread. Die ID eines Threads wird beim ersten Aufruf der ThreadId.get()-Methode angegeben.
package com.cjs.example; import java.util.concurrent.atomic.AtomicInteger; public class ThreadId { private static final AtomicInteger nextId = new AtomicInteger(0); private static final ThreadLocal<Integer> threadId = new ThreadLocal<Integer>() { @Override protected Integer initialValue() { return nextId.getAndIncrement(); } }; public static int get() { return threadId.get(); } public static void main(String[] args) { for (int i = 0; i < 10; i++) { new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getId()); } }).start(); } } }
3.1. Die Set-Methode
ist in Ordnung. Wie Sie sehen können, ist die unterste Ebene von ThreadLocalMap ein Array. Der Elementtyp im Array ist der Eintragstyp . Die Set-Operation besteht darin, den Wert auf die Mitgliedsvariable threadLocals von ThreadLocal festzulegen. Der ThreadLocalMap-Typ des aktuellen Threads ist dieser und der Wert ist der von uns angegebene Wert. Beachten Sie, dass dies die Variable (oder das Objekt) des ThreadLocal-Typs darstellt. Mit anderen Worten: Jeder Thread verwaltet ein Objekt vom Typ ThreadLocal.ThreadLocalMap. Die Set-Operation verwendet tatsächlich die ThreadLocal-Variable als Schlüssel, den Wert, den wir als Wert angeben, und kapselt dieses Schlüssel-Wert-Paar schließlich in ein Entry-Objekt und fügt es in ThreadLocal ein .ThreadLocalMap-Objekt des Threads. Jede ThreadLocal-Variable in diesem Thread ist ein Eintrag im ThreadLocal.ThreadLocalMap-Objekt. Da jede ThreadLocal-Variable einem Element in ThreadLocal.ThreadLocalMap entspricht, können diese Elemente gelesen, geschrieben und gelöscht werden. 3.2. get-Methode get()-Methode dient zum Abrufen der entsprechenden ThreadLocal-Variablen aus dem ThreadLocal.ThreadLocalMap-Objekt des aktueller Thread Der entsprechende Wert Grafisch sieht es so aus: Übergabe von Werten innerhalb des Thread-Lebenszyklus Endlich , alles Dank an ThreadLocalMap Das obige ist der detaillierte Inhalt vonWas ist ThreadLocal? Prinzipanalyse von ThreadLocal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!/**
* 返回当前线程对ThreadLocal变量的“初始值”
* 这个方法将在线程第一次访问变量(通过调用get方法)时被调用,如果之前已经调用过了就不会再调了
*
* @return the initial value for this thread-local
*/
protected T initialValue() {
return null;
}
/**
* 设置当前线程的ThreadLocal变量的副本为指定的值
*
* @param value the value to be stored in the current thread's copy of this thread-local.
*/
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
/**
* 返回当前线程的ThreadLocal变量副本的值
*
* @return the current thread's value of this thread-local
*/
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}
/**
* 删除当前线程的ThreadLocal变量副本的值
*/
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}