Ahoj,
sice pozdì, ale rád bych podotknul, ¾e pri opousteni synchronized sekce se
invaluduje cache a tim se zajisti prenos dat mezi procesory neplatí.
Pokud by platilo, nebyl by Double Check Problem. Pouze volatile zajistí
happens before.
Honza
--
Jan Bares
http://jan.vegetband.cz
Jiri Mares
Ahoj,
presne receno plati , ze ostatni vlakna po vstupu do synchronized sekce
vidi stav, ktery tam zanechalo nejake jine vlakno pred jejim opustenim
(viz druhy bod nize_
(pokud je to synchronized sekce nad stejnym objektem).
Tedy samotne opusteni nestaci, je nutne aby do te same
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
Ján Valkovič wrote:
Mna zaujima :-) urcite sa dozviem viac o multithreadingu a jave a
veciach okolo a este zaujimavejsim sposobom ako keby som cital o tom
kdesi pokec a este aj anglicky :-) rozhovor medzi clovekom z
akademickej sfery a praxe je vzdy zaujimavy ;-) takze ja som za
pokracovanie
Ahoj,
k situaci PROBLEM od verze 1.5 dojit nemuze. Drive to mozne bylo, ale od 1.5
ma Java vylepseny pametovy model a ten zarucuje, ze v okamziku, kdy new vrati
referenci, je objekt inicializovany (tj. probehl jeho konstruktor).
Je vsak mozne neco jineho (mapa je sdilena promenna typu Map):
Zdeněk Troníček wrote:
Ahoj,
k situaci PROBLEM od verze 1.5 dojit nemuze. Drive to mozne bylo, ale od 1.5
ma Java vylepseny pametovy model a ten zarucuje, ze v okamziku, kdy new vrati
referenci, je objekt inicializovany (tj. probehl jeho konstruktor).
Todle prave v 1.5 neplati! Instrukce se
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
Cituji z emailu od Lukas Barton [EMAIL PROTECTED]:
Zdeněk Troníček wrote:
Ahoj,
k situaci PROBLEM od verze 1.5 dojit nemuze. Drive to mozne bylo, ale od
1.5
ma Java vylepseny pametovy model a ten zarucuje, ze v okamziku, kdy new
vrati
referenci, je objekt inicializovany (tj. probehl
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
Zdeněk Troníček wrote:
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
Cituji z emailu od Lukas Barton [EMAIL PROTECTED]:
Zdeněk Troníček wrote:
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
Zdeněk Troníček wrote:
Tak jeste jednou:
Trida p = new Trida();
V okamziku kdy new vrati odkaz na nove vytvoreny objekt, je tento objekt
inicializovan (zajistuje to tzv. Initialization safety). To implikuje napr. to,
ze finalni promenne maji nastaveny hodnoty.
Jak muze jine vlakno ziskat odkaz
Cituji z emailu od Lukas Barton [EMAIL PROTECTED]:
Zdeněk Troníček wrote:
Tak jeste jednou:
Trida p = new Trida();
V okamziku kdy new vrati odkaz na nove vytvoreny objekt, je tento objekt
inicializovan (zajistuje to tzv. Initialization safety). To implikuje napr.
to,
ze finalni
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.
treba tak, ze v konstruktoru preda odkaz na this nekam jinam.
(viz: http://www.ibm.com/developerworks/java/library/j-jtp0618.html)
Ahoj,
problem v jave je v memory modelu v tom, ze pokud bezite na viceprocessorove
masine, pak vam spravny obsah pameti
zajisti bud mit promennou volatile (necachuje se a tudis se vzdy cte z hlavni
pameti) a nebo pouziti synchronized,
protoze pri opousteni synchronized sekce se invaluduje
Cituji z emailu od Lukáš Marek [EMAIL PROTECTED]:
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.
treba tak, ze v konstruktoru preda odkaz na this nekam jinam.
(viz:
Zdeněk Troníček wrote:
Cituji z emailu od Lukas Barton [EMAIL PROTECTED]:
Zdeněk Troníček wrote:
Tak jeste jednou:
Trida p = new Trida();
V okamziku kdy new vrati odkaz na nove vytvoreny objekt, je tento objekt
inicializovan (zajistuje to tzv. Initialization safety). To implikuje
Ale je to mozne, cituji z kapitoly 17 specifikace:
*These semantics do not prescribe how a multithreaded program should be
executed. Rather, they describe the behaviors that multithreaded
programs are allowed to exhibit. Any execution strategy that generates
only allowed behaviors is an
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.
Jinak kdyz jste zabrousil k izolacnim urovnim, tak si neodpustim poznamku.
Izolacni urovne byly definovany v SQL'89 specifikaci, tj. tim, jak
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:
Ahoj,
i) to Lukas M.:
Ten clanek (http://www.ibm.com/developerworks/library/j-dcl.html) znam, jenze -
podobne jako vsechny ostatni, ktere jsem prosel - se zabyvaji singletonama. Z
toho prameni moje nejistota, protoze to je prece jen trochu jiny pripad... v
pripade singletonu nas zajima
Jiri Dolezel napsal(a):
iii) to Lukas B.:
Tak to je prave to, cim si nejsem jisty. Mas pravdu, ze set/get jsou vzajemne
synchronizovane, coz zaruci vzajemne blokovani cteni a zapisu. Dokonce mame i
zaruceno, ze je kazdy Produkt vytvoren prave jednou. Ale je zaruceno to, ze se
nekonzistentni
Pro jistotu jsem se dival do zdrojaku Collections.java, viz nize.
Z toho uz je to snad zrejme, ze vsechny cteni a zapisy jsou vuci sobe
synchronizovane pres stejny objekt (tu mapu).
public static Map synchronizedMap(Map m) {
return new SynchronizedMap(m);
}
private static
a co jako implementaci pouzit ConcurrentHashMap, ta pouziva specialni
holdery (ConcurrentHashMap$HashEnty), kde je value definovana jako volatile.
Jiri Dolezel napsal(a):
Ahoj,
pracuji s JEE aplikaci provozovanou na viceprocesorovem stroji (Java 5), kde se
casto pouzivaji konstrukce tohoto
Ahoj,
uvedeny kod je spravne i pro viceprocesorove stroje.
Situace popsana v 1 nastat nemuze protoze kazdy zapis a cteni z
cacheOfProducts je synchronizovane (synchronizedMap) - tj. cteni zde po
zapisu vzdy pres synchronized. (put happens before get)
A pri vytvareni nove hodnoty
25 matches
Mail list logo