Ahoj,
jedna vec je atomicita operace a druha je memory model Javy. Takze zde
jde nejenom o to, ze uprostred cteni nebo zapisu muze byt operace
prerusena a predan procesor jinemu vlaknu. Ale to synchronized je tam i
proto, aby jine vlakno novou hodnotu "videlo" a tudiz necetlo stale
starou, jiz neplatnou hodnotu.
S pozdravem
On 06/13/2012 10:34 AM, 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
--
Jiří Mareš (mailto:[email protected])
ČSAD SVT Praha, s.r.o. (http://www.svt.cz)
Czech Republic