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
>
>
>
>

Odpovedet emailem