Zdeněk Troníček wrote:
Cituji z emailu od Lukas Barton <[EMAIL PROTECTED]>:
Zdeněk Troníček wrote:
Tak jeste jednou:
Trida p = new Trida();
V okamziku kdy new vrati odkaz na nove vytvoreny objekt, je tento objekt
inicializovan (zajistuje to tzv. Initialization safety). To implikuje napr.
to,
ze finalni promenne maji nastaveny hodnoty.
Jak muze jine vlakno ziskat odkaz na takto vytvoreny objekt drive nez dojde
k
navratu z new? (Krome zminene moznosti predani odkazu v konstruktoru
Tridy).
Mohl bys naznacit jak to bude vypadat v kodu?
Uvedu tedy kod primo ze specifikace:
http://java.sun.com/docs/books/jls/third_edition/html/memory.html#66562
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
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?
Takze jsme se po nekolika mailech shodli na tom, co jsem psal v prvnim mailu?
:o). Mimochodem, ten stav tech promennych neni nedefinovany, jen nemusi byt
aktualni.
Muze tam byt mix defaultnich hodnot a zapisu z ruznych vlaken (proto
jsem pouzil slovo nedefinovany).
Ja jsem ukazoval situace, kde to pri vice vlaknech selze. Vy jste
popisoval kdy to bude fungovat.