Ano, to ano. Podezřelé je už jen to, proč není podobný hodnotový objekt immutable :-) Já si ale potřeboval ujasnit moje chápání a mé klíčové opomenutí bylo, že nejde jen o atomicitu, ale i viditelnost mezi thready (happends-before). Díky!
2012/6/13 Kamil Podlesak <[email protected]> > Samotná operace by se dala považovat za atomickou, ale pokud se jedná > o objekt tak třeba ještě nemusí být korektně inicializován... > > V každém případě, ten originální kód (tj. synchronized u getterů a > setterů) bych okamžitě považoval za velmi podezřelý a začal zkoumat, > jak a kde se ten objekt vůbec používá. S velmi vysokou > pravděpodobností je totiž špatně a spoléhá na tyto "synchronized" > místo toho aby korektně synchronizoval. Jistě, možná že bude správně, > ale na 90% očekávám něco jako: > if (a.getF() > 0) { > something( a.getF() ) > } else { > something)( 0 ) > } > > Kamil Podlešák > > 2012/6/13 Libor Jelinek <[email protected]>: > > 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]> > >> > >> 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 > >> > >> > >> > > > > > > -- > > Kamil Podlešák >
