Jste vedle jak ta jedle. Podívejte se na Java Language Specification a najděte mi ten váš extra objekt. Instance třídy ThreadLocal jsou objekty jako každé jiné a nemají žádná specifika a už vůbec není pravda že objekt typu ThreadLocal má platnost pouze v rámci jediného vlákna. Pokud si projdete zdrojové kódy tříd Thread a ThreadLocal, zjistíte ThreadLocal je vcelku jednoduchá třída (až na některé složitosti kvůli garbage collection).
Aby jste mohl ThredLocal používat, musíte vytvořit instanci. Tuto instanci musíte zpřístupní všem třídám, které ji hodlají využívat. Taková instance se vytvoří na Heapu a heap je zdílený všemi vlákny. Z kteréhokoli vlákna můžete zavolat hashCode a vždy dostanete tu samou hodnotu.
Asi největší "specialitou" je nativní metoda Thread.currentThread() bez které by tento mechanismus ThreadLocal nefungoval.
Máte pravdu v tom, že instance ThredLocal do sebe umí uložit objekt a svázat s aktuálním vláknem. Ale jak už jsem psal v minulém příspěvku to samé lze provést mapou Map<Thread,Object>. Jednoduchá implementace by mohla vypadat takto:
public class ThreadLocal<T> { private Map<Thread,T> map = new HashMap<Thread,T>(); public void set(T obj) { this.map.put(Thread.currentThread(), obj); } public void T get() { return this.map.get(Thread.currentThread()); } }
(kod neni dokonaly, ale jako nastrel dostacujici)
doufam ze sem vas jiz presvedcil o tom, ze jazyk Java s k objektum ThreadLocal stavi stejne jako k ostatnim a rozsah platnosti promene urcuji standardni modifikatory static,private,protected,public stejne jako u vsech ostatnich Objektu. Jeste vam pridam odkaz na Java Language Specification
Na dost zajímavé články ohledně transakcí v EJB jsem narazil na http://www.ibm.com/…raryview.jsp?…