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


Odpovedet emailem