ThreadLocal Verständnissproblem

Status
Nicht offen für weitere Antworten.

h2o

Neues Mitglied
Hi Leute,

ich versteht nicht wie der ThreadLocal genau funktionieren soll.

Nehmen wir mal ein bisschen Code als Bsp:
Code:
private static abstract class Provider extends Object implements SZRPC.Delegate
	{
		private final ThreadLocal	_local = new ThreadLocal();

		protected Provider()
		{
			super();
		}
		
		protected SZIdentity identity()
		{
			SZIdentity	anIdentity = (SZIdentity) _local.get();
			
			if ( anIdentity != null )
			{
				_local.set( null );
			
				return anIdentity;
			}

			throw new IllegalStateException( "SZRPCService.Provider.identity: null identity." );
		}
        .....
}

SZIdentity ist ne andere Klasse welche importiert wurde.

Frage:
wie läuft das jetzt genau ab? Könnt ich aus jeder beliebigen Klasse eine Instanz erzeugen wie folgt?

Code:
SZIdentity	anIdentity = (SZIdentity) _local.get();
SZCar	aCar = (SZCar) _local.get();
SZBlabla aBla = (SZBlabla) _local.get();

etc..


oder muss man erst definieren was sich hinter dem _local versteckt?

like this:
Code:
private final ThreadLocal	_local = new ThreadLocal();
SZCar aCar = new SZCar(par1, par2, par3);

_local.set(aCar);


hoffe ich hab alles verständlich formuliert.

mfG h2o
 

Illuvatar

Top Contributor
1. Deine identity Methode ist komisch. Wieso setzt du das auf null, wenn etwas zurückgegeben wird?

2. Erstmal ist für alle Threads die Variable null. Du kannst dann entweder in den Threads per set diese initialisieren oder du überschreibst initialValue() und initialisierst die Objekte dort.
 

h2o

Neues Mitglied
Illuvatar hat gesagt.:
1. Deine identity Methode ist komisch. Wieso setzt du das auf null, wenn etwas zurückgegeben wird?

damit nicht die selbe identity zweimal vergeben wird!?


Illuvatar hat gesagt.:
2. Erstmal ist für alle Threads die Variable null. Du kannst dann entweder in den Threads per set diese initialisieren oder du überschreibst initialValue() und initialisierst die Objekte dort.

dort kann ich beliebig viele objekte initialisieren? und wie kann ich dann bestimmen welches objekt ich mit get() zurück bekomme?
 

Illuvatar

Top Contributor
Ich glaube du hast das Prinzip von ThreadLocal falsch verstanden...
ThreadLocal dient dazu, für jeden Thread ein Objekt bereit zu stellen. Das geschieht automatisch, da musst du nichts mehr machen. Jeder Thread greift automatisch get/set Methode auf die Variable, die zu dem aufrufenden Thread gehört, zu.
Und diese Variablen, eine pro (benutzendem) Thread, werden eben mit null initialisiert. Wenn du sie anders initialisieren willst, verwendest du die initialValue Methode.
Folgendes Beispiel aus der API stellt jedem unterschiedlichen aufrufenden Thread eine eigene ID bereit:
Code:
 public class SerialNum {
     // The next serial number to be assigned
     private static int nextSerialNum = 0;

     private static ThreadLocal serialNum = new ThreadLocal() {
         protected synchronized Object initialValue() {
             return new Integer(nextSerialNum++);
         }
     };

     public static int get() {
         return ((Integer) (serialNum.get())).intValue();
     }
 }
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben