Cituji z emailu od Lukas Barton <[EMAIL PROTECTED]>: > > Hmm. Hezke. To ovsem neni ani nahodou odpoved na moji otazku "Jak muze > vlakno > > ziskat odkaz na objekt vytvareny v jinem vlakne drive nez dojde k navratu z > > new". > > > Proc by nemohlo? JIT si to muze prehazet jak chce kdyz dodrzi vlastnosti > pameti dane specifikaci. > Vyse uvedeny kod muze JIT serializovat napriklad takto: > > vlakno1 vlakno2 > writer(); > x=3; > f= to co casem vrati new ve vlakne 1 je > zapsano nejdriv do pameti pro vlakno 2 > f!=null; // je true > // tady JIT vi, ze muze klidne pustit vlakno 2, i kdyz vlakno 1 jeste si > do sve pameti pro f nic nezapsalo > int i=f.x; // cteme 3 > int j=f.y // cteme 0 > y=4; > f= zapiseme f pro vlakno 1 > ..... > > Vyse uvedeny kod neporusuje specifikaci, vlakno 2 ma vsechny cteni > spravne i kdyz jeste procesor nevykonal vsechny instrukce z > konstruktoru. JIT to tedy muze klidne takto prehazet. Proc by podle vas > nemohl?
Toto v Jave neni mozne. K alokaci pameti v JVM slouzi instrukce new, jejimz parametrem je trida, od niz chceme vytvorit instanci (presneji je to index do constant poolu, kde je polozka popisujici tuto tridu). Napr.: Box p = new Box(); se prelozi takto (uvadim vystup z javap -c): 0: new #2; //class vlakna/Box 3: dup 4: invokespecial #3; //Method vlakna/Box."<init>":()V 7: astore_1 Instrukce new na radku 0 provede alokaci pameti a vynulovani (tj. atributy se nastavi na defaultni hodnoty). Ukazatel na alokovanou pamet je na zasobniku! A k tomuto zasobniku ma pochopitelne pristup jen vlakno, kteremu zasobnik patri. Pokud jde o ty dalsi instrukce, tak dup provede duplikaci hodnoty na vrcholu zasobniku a invokespecial zavola konstruktor. Konstruktor vyzvedne parametr (this) z vrcholu zasobniku. Instrukce astore_1 provede prirazeni reference na vrcholu zasobniku (tj. odkazu na vytvoreny objekt) do slotu 1 (promenna p je ve slotu 1, protoze ve slotu 0 je args - jde o kod z metody main). Jave zdar, Z.T. -- Zdenek Tronicek Department of Computer Science and Engineering Prague tel: +420 2 2435 7410 http://cs.felk.cvut.cz/~tronicek
