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
>

Odpovedet emailem