Cituji z emailu od Lukas Barton <[EMAIL PROTECTED]>:

> Zdeněk Troníček wrote:
> > Ano, muze dochazet k prehozeni instrukci (muze to provest compilator, JIT,
> nebo
> > to muze byt dusledek cache). Toto je ovsem vyjimka. Viz specifikace na str.
> > 322:
> >
> > "Just before a reference to the newly created object is returned as the
> result,
> > the indicated constructor is processed to initialize the new object using
> the
> > following procedure: ..."
> >
> To samozrejme platit musi - spravne receno, JIT si muze instrukce
> prehazet jak chce, pokud to neovlivni beh programu. Specifikace nerika,
> jak ma fungovat JIT. Rika jak mate jeho fungovani vnimat.
> Ale nikde se tam nemluvi o tom, ze ten vysledek v pameti vidi  i ostatni
> vlakna!
> (http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.5)

Mam pocit, ze Ti nerozumim. Jak vlakno 2 ziska odkaz na objekt, ktery vytvari
vlakno 1? (Krome pripadu, kdy mu ten odkaz predame v konstruktoru objektu, coz
se vyslovne nedoporucuje). Preci pokud vlakno vytvari objekt pres new, tak
odkaz na objekt dostane az pote, co dojde k navratu z new. A to uz je objekt
inicializovan.
Jinak tato vlastnost memory modelu se jmenuje Initialization safety a Google mi
o tom nasel napr. clanek http://www.ibm.com/developerworks/library/j-jtp03304/.

> >
> > Plati to i pro promenne inicializovane inicializatorem. Tj.
> >
> S tim souhlasim.
> > public class X {
> >   final double RATE = Math.random();
> >   ...
> > }
> >
> > Pokud jde o pristup k finalni promenne, tak nevidim duvod, proc by nemel
> > fungovat getter.
> >
> Getter samozrejme fungovat bude.
> Ale pokud inicializujete slozitejsi objekt a ulozite si referenci na nej
> do final i do nonfinal promene. A budete to cist stejnou z referenci z
> nonfinal promene, muzete ziskat nekonzistentni stav. Podobne kdyz pres
> getter ziskany slozity objekt predate do jineho vlakna.
>

Bavime se o tomto?

class Complex { }
class Holder {
  final Complex C;
  Complex c;
  Holder() {
    C = c = new Complex();
  }
}

Pak objekt Complex bude plne inicializovan. Tj. vsechny finalni promenne budou
mit hodnotu, kterou jim nastavime inicializatorem nebo v konstruktoru. Muze se
ovsem stat, ze pro jine vlakno bude mit c hodnotu null, coz odpovida memu
prvnimu prikladu.

U te posledni vety ("Podobne kdyz pres getter..."), nevim co myslite.

Z.T.
-- 
Zdenek Tronicek
Department of Computer Science and Engineering
Prague                   tel: +420 2 2435 7410
http://cs.felk.cvut.cz/~tronicek


Odpovedet emailem