Zdeněk Troníček wrote:
Ja jsem ten kod uvadel proto, aby bylo videt, ze ten Vas scenar neni mozny.
Odkaz na alokovanou pamet je na zasobniku a ten je privatni pro dane vlakno.
Asi se nedomluvime ;-)

Prostudujte si nasledujici odkazy:

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

Tam mate kod, ktery vygeneruje JIT (nikoliv bytecode, ktery  posilate vy).

Potom porovnejte http://java.sun.com/docs/books/jls/third_edition/html/execution.html#12.5 a http://java.sun.com/docs/books/jls/first_edition/html/12.doc.html#44670 (jsou stejne - v obou je 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:.....)

Ale kdyby platilo, to co tvrdite, muselo by to s volatile fungovat uz v 1.4 - spravny pointer byste dostal, ale videl byste neinicializovanou pamet. Coz neni pravda (viz prvni odkaz):

"This /does not work/ under the current semantics for volatile."

Protoze v 1.4 a driv mohl dat JIT instrukce konstruktoru az zapis do volatile promenne a taky to delal ;-).


Jinak kdyz jste zabrousil k izolacnim urovnim, tak si neodpustim poznamku.
Izolacni urovne byly definovany v SQL'89 "specifikaci", tj. tim, jak ovlivnuji
pohled klienta na databazi. Jak se ovsem brzy ukazalo, definice to nebyla moc
presna a pro pochopeni toho, jak skutecne funguji, je temer nezbytne seznamit
se s implementaci pomoci zamku (ackoliv nekdo muze namitnout, ze implementovany
mohou byt i jinak - a bude mit pravdu).
To muzeme nechat na priste. Taky do toho vidim. A taky se muzeme nedohodnout. (vim jak to ma implementovane Informix, Oracle, DB2, MS SQL Server 2003/2005 a Interbase).
Z.T.

Odpovedet emailem