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.