Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Libor Jelinek
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

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Peter Štibraný
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

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Jiří Mareš
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

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Libor Jelinek
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

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Peter Štibraný
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

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Kamil Podlesak
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

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Libor Jelinek
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

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Filip Jirsák
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ř

Re: Potřebují být synchronizované jednořádkové gettery/settery?

2012-06-13 Tema obsahu Zdeněk Troníček
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