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 <ljeli...@virtage.com>: > 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ý <pstibr...@gmail.com> >> >> 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