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
