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
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
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
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
Zapis do volatile fieldu a citanie z volatile fieldu taktiez vytvaraju
happens-before vztah.
return f je citanie fieldu. Zapis a citanie z fieldov je atomicka operacia
okrem pripadu ze ide o long alebo double, ktore zaroven nie su volatile. Inymi
slovami, citanie a zapis volatile long a
Samotná operace by se dala považovat za atomickou, ale pokud se jedná
o objekt tak třeba ještě nemusí být korektně inicializován...
V každém případě, ten originální kód (tj. synchronized u getterů a
setterů) bych okamžitě považoval za velmi podezřelý a začal zkoumat,
jak a kde se ten objekt vůbec
Ano, to ano. Podezřelé je už jen to, proč není podobný hodnotový objekt
immutable :-) Já si ale potřeboval ujasnit moje chápání a mé klíčové
opomenutí bylo, že nejde jen o atomicitu, ale i viditelnost mezi thready
(happends-before). Díky!
2012/6/13 Kamil Podlesak kamil.podle...@gmail.com
Zdravím,
ekvivalentní to určitě není. synchronized instanční metoda je ekvivalentní
bloku synchronized(this) {…}, tj. ten setter odpovídá
public void setF(int f) {
synchronized(this) {
this.f = f;
}
}
Tj. pokud máte ty settery a gettery synchronizované, netýká se to jen
operací uvnitř
Dobry den,
kdyz jedno vlakno priradi do volatile promenne a a druhe vlakno do
volatile promenne f, tak se prirazeni take nevykonaji paralelne, protoze
pristupy do pameti se (vetsinou) serializuji.
Navic nam je jedno, jak se to vykona. Dulezity (z hlediska ekvivalence) je
vysledek. A ten je v obou