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