Implementierung von Simulations -Threadlokalklassen: Freigegebene Variablen innerhalb des Thread -Bereichs können nur auf ihn zugreifen und kann nicht auf andere Threads zugreifen.
Paket com.ljq.test.thread; AB -Modul * @Author Administrator * * * */öffentliche Klasse ThreadScopesharedata {// Die gemeinsam genutzten Daten private statische int data = 0; <Thread, Integer> (); // Die Daten im aktuellen Thread ändern, geben Sie die Änderungsinformationen an .out.println (Thread.CurrentHread (). }} Statische Klasse A {public void get () {int data = threadData.get (Thread.CurrentThread ()); public void () {int data = threadData.get (Thread.CurrentThread ());
Run Ergebnisse:
Die Rolle und der Zweck von ThreadLocal:
Für die Datenfreigabe in Threads, dh für denselben Programmcode, müssen mehrere Module beim Ausführen im selben Thread gemeinsam genutzt werden, und ein anderer Daten wird beim Ausführen in einem anderen Thread freigegeben.
Jeder Thread ruft die festgelegte Methode des globalen ThreadLocal -Objekts auf, was dem Hinzufügen eines Datensatzes zur internen Karte entspricht. Am Ende des Threads können Sie die ThreadLocal.Clear () -Methode aufrufen, damit der Speicher schneller freigegeben wird und es in Ordnung ist, ihn aufzurufen, da der Thread auch die zugehörigen ThreadLocal -Variablen automatisch freigeben kann.
Anwendungsszenario von ThreadLocal:
Die Bestellverarbeitung enthält eine Reihe von Vorgängen: Reduzieren Sie das Inventar, fügen Sie ein laufendes Konto hinzu und ändern Sie das allgemeine Konto. Andernfalls werden alle Vorgänge eingereicht, wodurch diese Vorgänge das gleiche Datenbankverbindungsobjekt verwenden, und der Code dieser Vorgänge befindet sich in verschiedenen Modulklassen.
Bankübertragungen enthalten eine Reihe von Operationen: Reduzieren Sie den Kontostand aus dem Konto und erhöhen Sie den Kontostand auf das Konto. Übertragungsvorgänge Der Code ist die Methode von zwei verschiedenen Kontoobjekten.
In dem ActionContext von Strut2 wird beispielsweise der gleiche Code von verschiedenen Threads aufgerufen, die von diesem Code betriebenen Daten der Status und der Daten für verschiedene Threads sind Ein Thread, egal wie oft die GetContext -Methode und die GetContext -Methode aufgerufen werden, in welchem Modul das Modul gleich ist.
Experimentelle Fälle: Definieren Sie eine ThreadLocal -Variable, die global geteilt wird, und starten Sie dann mehrere Threads, um einen zufälligen Wert für die ThreadLocal -Variable zu speichern, und rufen Sie dann die anderen Mehrfachmethoden verschiedener Kategorien auf Sie können sehen, dass mehrere Klassen dieselben Daten im selben Thread teilen.
Um die ThreadLocal -Variable zu verkapulieren, damit die Außenwelt die ThreadLocal -Variable nicht direkt bedienen sollte.
Diese Anwendung ist relativ selten für die Verpackung von Grundtypen von Daten.
Die Verpackung von Objekttypdaten ist häufiger, dh eine bestimmte Klasse ein unabhängiges Instanzobjekt für verschiedene Threads erstellen.
Paket com.ljq.test.thread; Geben Sie ein Instanzobjekt an. <2; ; "name" + data); Die entsprechende Methode statische Klasse A {public void get () {int data = x.get (); ); .Getage ()); "," + mydata.getage ());}} // Verwenden Sie die entsprechende Methode statische Klasse B {public void get () {int data = x .get (); .CurrentHRead (). GetMyData: " + mydata.getName () +", " + mydata.getage ()); nutzen Mytheadscopedata () {} // eine Instanzmethode an und stören Sie sich nicht miteinander. der Datensatz im aktuellen Thread -Bereich statische ThreadLocal <MyTheadscopedata> MAP = New ThreadLocal <MytheScopeedata> (); .Name = name;} public int getageage () {return ay;} public void setage (int age) {this.age = älter;}}}