Ale je to mozne, cituji z kapitoly 17 specifikace:
*These semantics do not prescribe how a multithreaded program should be
executed. Rather, they describe the behaviors that multithreaded
programs are allowed to exhibit. Any execution strategy that generates
only allowed behaviors is an acceptable execution strategy.*
Rozlisujte specifikaci a implementaci.
Nize uvedene je IMHO naprosto irelevantni. At si to konkretni JVM
prelozi do instrukci pro konkretni procesor jak uzna za vhodne. Je uplne
jedno, ze treba JVM od Sunu na procesoru od Intelu to dela tak jak
pisete (a kdovi jak to pak dela ten procesor).
Kdyz by ve drive uvedenom kodu bylo v konstruktoru
misto y = 4; napr. volani nekam pres sit s ulozenim casu volani na tom miste v
siti
a stejne tak misto int j = f.y; // could see 0
*Mohl byste na tom vzdalenem serveru videt prichozi volani v opacnem
poradi a zadna java speficikace by nebyla porusena!
*
Je to podne jako s ACID a urovni izolace transakci. Mate jen
specifikovano, jak to klient vidi. Nikoliv jak je to na konkretnim
databazovem serveru implementovane. Ten si muze delat jakakoliv kouzla
(a delat je bude aby dosahl lepsiho vykonu).
Zdeněk Troníček wrote:
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.