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

Odpovedet emailem