Libi se mi, ze neodbihate od tematu :o). Tak naposledy (protoze tato "diskuze" v konferenci pravdepodobne temer nikoho nezajima):
>>>> 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 > ..... Jak bude vypadat JAVOVSKY kod vlaken 1 a 2? Jinak v jednom z predchozich mailu jsem Vam doporucoval seznamit se s Initialization safety. Protoze moje rada patrne nebyla vyslysena, pridavam citaci z http://www.ibm.com/developerworks/library/j-jtp03304/: "The new JMM also seeks to provide a new guarantee of initialization safety -- that as long as an object is properly constructed (meaning that a reference to the object is not published before the constructor has completed), then all threads will see the values for its final fields that were set in its constructor, regardless of whether or not synchronization is used to pass the reference from one thread to another. Further, any variables that can be reached through a final field of a properly constructed object, such as fields of an object referenced by a final field, are also guaranteed to be visible to other threads as well. This means that if a final field contains a reference to, say, a LinkedList, in addition to the correct value of the reference being visible to other threads, also the contents of that LinkedList at construction time would be visible to other threads without synchronization. The result is a significant strengthening of the meaning of final -- that final fields can be safely accessed without synchronization, and that compilers can assume that final fields will not change and can therefore optimize away multiple fetches." Tim je doufam jasne, ze ten Vas pseudokod vyse je nerealny. Z.T. -- Zdenek Tronicek Department of Computer Science and Engineering Prague tel: +420 2 2435 7410 http://cs.felk.cvut.cz/~tronicek Quoting Lukas Barton <[EMAIL PROTECTED]>: > 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. > > > >