Vlákno názorů k článku JBoss: EJB a transakce od bery - na těchto proměnných není vůbec nic speciálního. ThreadLocal...

  • Článek je starý, nové názory již nelze přidávat.
  • 18. 5. 2009 7:53

    bery (neregistrovaný)
    na těchto proměnných není vůbec nic speciálního. ThreadLocal je třída jako každá jiná a pro uložení hodnot používá zřejmě něco jako Map<Thread,Object>.
  • 18. 5. 2009 8:54

    slady (neregistrovaný)
    No to je sice možné, že se data z těchto proměnných čtou běžným způsobem, ale speciální je na tom čtení to, že se data vážou k vláknu a jsou v rámci něj globální.

    Normální jsou totiž při čtení proměnných dva způsoby:
    1) lokální data - čtou se z předaných parametrů metody (v jediném vlákně)
    2) globální data - jsou sdílená mezi všemi vlákny

    Ukládání dat k jednotlivému vláknu je speciální tím, že je mohou číst všechny metody, ale platí jen v rámci jediného vlákna. To je v jazyku Java něco "extra".
  • 19. 5. 2009 13:10

    bery (neregistrovaný)

    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

  • 19. 5. 2009 15:26

    kert (neregistrovaný)
    Myslím, že autor měl na mysli, že "lokální proměnné vlákna" jsou speciální svým použitím, svojí sémantikou, ne že jsou nějak zvlášť speciální svojí implementací. Tak nevím, proč se tady hádáte.
  • 22. 5. 2009 9:51

    slady (neregistrovaný)
    Děkuji za odpověď, přesně v takovém duchu myslím i svůj příspěvek.