Heim  >  Artikel  >  Java  >  ThreadLocal löst Beispiele für Multithread-Programme

ThreadLocal löst Beispiele für Multithread-Programme

零下一度
零下一度Original
2017-07-26 16:52:431990Durchsuche

Ich glaube, dass die Leser auch viele Informationen über ThreadLocal im Internet gelesen haben. Viele Blogs sagen Folgendes: ThreadLocal bietet eine neue Denkweise zur Lösung des Parallelitätsproblems von Multi -threaded-Programme. Der Zweck von ThreadLocal besteht darin, das Problem der gemeinsamen Nutzung zu lösen, wenn mehrere Threads auf Ressourcen zugreifen. Wenn Sie so denken, dann geben Sie Ihnen 10 Sekunden Zeit, um Ihre bisherigen Missverständnisse über ThreadLocal auszuräumen!
Sehen Sie sich an, wie der Quellcode im JDK geschrieben ist:

This class provides thread-local variables. These variables differ from
their normal counterparts in that each thread that accesses one (via its
{@code get} or {@code set} method) has its own, independently initialized
copy of the variable. {@code ThreadLocal} instances are typically private
static fields in classes that wish to associate state with a thread (e.g.,
a user ID or Transaction ID).

Die Übersetzung ist wahrscheinlich so (Englisch ist nicht gut, wenn Sie eine bessere Übersetzung haben, hinterlassen Sie bitte eine Nachricht):

Die ThreadLocal-Klasse wird verwendet, um lokale Variablen innerhalb des Threads bereitzustellen. Wenn auf diese Art von Variablen in einer Multithread-Umgebung zugegriffen wird (Zugriff über die Get- oder Set-Methode), kann sichergestellt werden, dass die Variablen in jedem Thread relativ unabhängig von den Variablen in anderen Threads sind. ThreadLocal-Instanzen sind normalerweise vom privaten statischen Typ und werden zum Zuordnen von Threads und Thread-Kontexten verwendet.

lässt sich in einem Satz zusammenfassen: Die Funktion von ThreadLocal besteht darin, lokale Variablen innerhalb des Threads bereitzustellen. Diese Art von Variablen funktioniert innerhalb des Lebenszyklus des Threads und reduziert einige gemeinsame Variablen zwischen mehreren Funktionen oder Komponenten im Gleicher Thread. Die Komplexität der Übertragung.
Wenn ich zum Beispiel ausgehe, muss ich zuerst den Bus und dann die U-Bahn nehmen. Hier sind wie zwei Funktionen im selben Thread, den ich erledigen muss Funktionen Das Gleiche: Buskarte (sowohl Pekinger Busse als auch U-Bahnen verwenden Buskarten). Um die Buskartenvariable nicht an beide Funktionen weiterzugeben (entspricht nicht immer der Buskarte auf der Straße), kann ich dies tun : Die Buskarte wird im Voraus an eine Agentur übergeben, und wenn ich die Karte durchziehen muss, frage ich bei dieser Agentur nach der Buskarte (natürlich bekomme ich jedes Mal die gleiche Buskarte). Auf diese Weise kann ich, solange ich (derselbe Thread) eine Buskarte benötige, diese Organisation jederzeit und überall anfordern.

Jemand hat etwas zu sagen: Sie können die Buskarte als globale Variable festlegen, sodass Sie die Buskarte jederzeit und überall erhalten können, oder? Was aber, wenn es viele Personen (viele Threads) gibt? Es kann nicht jeder die gleiche Buskarte verwenden (wir gehen davon aus, dass die Buskarte mit echtem Namen authentifiziert ist), sonst wird es chaotisch. Verstehst du es jetzt? Dies ist die ursprüngliche Absicht des ThreadLocal-Designs: lokale Variablen innerhalb des Threads bereitzustellen, auf die jederzeit und überall innerhalb dieses Threads zugegriffen werden kann, während andere Threads isoliert werden.

(1) ThreadContext8742468051c85b06f0a0af9e3e506b5c bietet eine Methode zum Binden und Lösen von Objekten für den aktuellen Thread basierend auf Schlüssel/Wert-Paaren.

Diese Klasse stellt Thread-lokale Variablen bereit. Diese Variablen unterscheiden sich von gewöhnlichen Variablen darin, dass jeder Thread, der auf einen Thread zugreift (über seine Get- oder Set-Methode), über eine eigene, unabhängig initialisierte Kopie der Variablen verfügt.

Eine ThreadLocal-Instanz ist normalerweise ein privates statisches Feld in einer Klasse, das den Status einem Thread zuordnen möchte (zum Beispiel: einem Benutzer). ID oder Transaktions-ID). Jeder Thread hat einen impliziten Verweis auf eine Kopie der lokalen Variablen des Threads,

Solange der Thread aktiv ist, Auf die ThreadLocal-Instanz kann zugegriffen werden. Nach dem Tod eines Threads werden alle Kopien der Thread-Local-Instanz durch Müll gesammelt (sofern keine anderen Referenzen vorhanden sind).

8742468051c85b06f0a0af9e3e506b5c ist das im Thread gespeicherte Objekt. Das heißt, eine Klasse T ist ein Klassenattribut eines Threads.

Häufig verwendete Methoden sind:

 1 public class ThreadLocal8742468051c85b06f0a0af9e3e506b5c { 2  3 //设置属性 4  5 public void set(T value) { 6 Thread t = Thread.currentThread(); 7 ThreadLocalMap map = getMap(t); 8 if (map != null) 9 map.set(this, value);10 else11 createMap(t, value);12 }13 14 //获取属性15 16 public T get() {17 Thread t = Thread.currentThread();18 ThreadLocalMap map = getMap(t);19 if (map != null) {20 ThreadLocalMap.Entry e = map.getEntry(this);21 if (e != null)22 return (T)e.value;23 }24 return setInitialValue();25 }26 27 //获取线程的 ThreadLocal.ThreadLocalMap28 29 ThreadLocalMap getMap(Thread t) {30 return t.threadLocals;31 }32 33 }34 35 //新建一个线程本地的localMap36 37 void createMap(Thread t, T firstValue) {38 t.threadLocals = new ThreadLocalMap(this, firstValue);39 }

(2) Anwendungsbeispiele: Verbindung und Sitzung sind wie folgt :

 1 private static ThreadLocal2918aec6680a0636f336c3e736b1ff5a connectionHolder 2 = new ThreadLocal2918aec6680a0636f336c3e736b1ff5a() { 3 public Connection initialValue() { 4     return DriverManager.getConnection(DB_URL); 5 } 6 }; 7   8 public static Connection getConnection() { 9 return connectionHolder.get();10 }
 1 private static final ThreadLocal threadSession = new ThreadLocal(); 2   3 public static Session getSession() throws InfrastructureException { 4     Session s = (Session) threadSession.get(); 5     try { 6         if (s == null) { 7             s = getSessionFactory().openSession(); 8             threadSession.set(s); 9         }10     } catch (HibernateException ex) {11         throw new InfrastructureException(ex);12     }13     return s;14 }

Das obige ist der detaillierte Inhalt vonThreadLocal löst Beispiele für Multithread-Programme. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn