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.

Odpovedet emailem