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 používá. S velmi vysokou
pravděpodobností je totiž špatně a spoléhá na tyto "synchronized"
místo toho aby korektně synchronizoval. Jistě, možná že bude správně,
ale na 90% očekávám něco jako:
if (a.getF() > 0) {
  something( a.getF() )
} else {
  something)( 0 )
}

Kamil Podlešák

2012/6/13 Libor Jelinek <ljeli...@virtage.com>:
> 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 atomická operace nebo není?
>
>
> 2012/6/13 Peter Štibraný <pstibr...@gmail.com>
>>
>> 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
>>
>>
>>
>



--

Kamil Podlešák

Odpovedet emailem