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