Zapis do volatile fieldu a citanie z volatile fieldu taktiez vytvaraju happens-before vztah.
"return f" je citanie fieldu. Zapis a citanie z fieldov je atomicka operacia okrem pripadu ze ide o long alebo double, ktore zaroven nie su volatile. Inymi slovami, citanie a zapis volatile long a volatile double fieldov je atomicka operacia. Cize odpoved na Vasu otazku je, ze to zavisi od "volatile" a od toho ci je "f" long/double alebo nie. -Peter On Wednesday, 13. June 2012 at 10:59, Libor Jelinek wrote: > Aaaa! Pravda! Synchronized vlastně mj. nastavuje i happens-before vztah. > > Podotázka k setteru: Kdybych z nějakého prapodivného důvodu nechtěl mít > setter setter metodu jako synchronized, bylo by ekvivalentní nastavované pole > označit jako volatile, že? > > Zbývající otázka: Je "return f" v getteru atomická operace nebo není? > > > 2012/6/13 Peter Štibraný <[email protected] (mailto:[email protected])> > > Dobry den, > > > > problem nie je s atomicitou operacie, ale s tym, aby tato zmena (zapis do > > premennej) bola viditelna v inych threadoch. Ak takuto viditelnost > > potrebujete, tak potrebujete nejaku formu synchronizacie. Ak tam ziadnu > > synchronizaciu mat nebudete, tak sa moze stat ze ine thready uvidia staru > > hodnotu. > > > > -Peter > > > > > > On Wednesday, 13. June 2012 at 10:34, Libor Jelinek wrote: > > > > > DD, > > > často při čtení kódu (ale i učebnicích) narážím na něco jako toto: > > > > > > class A { > > > private int f; > > > public synchronized int getF() { return f }; > > > public synchronized void setF(int f) { this.f = f }; > > > } > > > > > > Podle JLS je atomické jednoduché čtení/zápis referečnní proměnné a > > > primitives krom long a double (pokud nejsou volatile). Nehrozí tedy u > > > nich žádné interleaving (přerušení v půlce). > > > > > > To, myslím, beze zbytku platí pro setF(), kdy se jedná o jednoduché > > > nastavení, a tedy nemusí být synchronized. > > > > > > U getF() jsou to možná dvě operace (instrukce) pro JVM (přečíst a > > > vrátit), ale nejsem si jistý, a proto v tomto případě taky raději > > > synchonizuju... > > > > > > Chci se tedy zeptat, jestli je tedy u setF() synchronizace opravdu > > > zbytečná. A jak je to s getF(), zda je to atomická operace a také není > > > nutné synchronizovat. > > > > > > Díky > > > Libor > > >
