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
}
}
}
Tak ted uz Ti vubec nerozumim. Co tedy rikas? Ze hodnoty finalnich promennych
jsou vzdy nastaveny spravne nebo ze objekt nemusi byt inicializovan, protoze
muze dojit k prehazeni poradi instrukci?
Hodnoty finalnich promennych jsou nastaveny spravne.
Ostatni muzou byt pro jine vlakno v nedefinovanem stavu (viz priklad vyse).
Mel jsem pocit, ze v predchozim mailu
to bylo to druhe a ted je to to prvni :o).
To ne. Hodnoty finalnich promennych jsou zapsany ve sdilene pameti a nemeni se.
Tudiz pri pristupu pres C i c je vidi vsechna vlakna stejne.
To jste prosim vycetl v ktere casti specifikace?
Ve specifikaci se o zadne sdilene pameti nepise. Pouzivaji se terminy
jako cteni, zapis, happens before apod.
Vlakno 1 vyrobi novy holder a ulozi ho dejme tomu do staticke volatile
promenne.
Vlakno 2 precte holder.C, a nasetuje ho do nejake staticke (nonvolatile)
promenne odkud ho precte vlakno 3. Tak vlakno 3 nemusi videt vnitrek
objektu typu Complex spravne. Protoze tato vlastnost je tranzitivni
pouze pro pristup pres final promennou. Coz vlakno 3 porusi.
Vlakno 3 uvidi inicializovany objekt, tj. po provedeni konstruktoru. Co je na
tom nespravneho?
Neuvidi. Proc by ho melo videt, ma pointer nekam na heap a jelikoz se k
nemu nedostalo pres volatile ci final promenou (a samozrejme ani pres
synchronized sekci) vlakno 3 proste nemusi videt stav toho objektu
spravne (potencielne kdyz uz bude mit spravny pointer uvidi spatne
nonfinal fieldy).