V Javě jsou ostatní základní proměnné atomické, kromě 8bajtových 64bitových proměnných Long a Double.
Java storage model vyžaduje, aby operace get i store byly atomické, ale pro nevolatilní dlouhé a dvojité proměnné umožňuje JVM rozdělit 64bitové čtení nebo zápis na dvě 32bitové operace.
Pokud čtení a zápis probíhají na různých vláknech, čtení dlouhého nevolatilního typu může vést k vysokému počtu 32 bitů jedné hodnoty a nízkým 32 bitům druhé.
Takže i když vám na expirovaných datech nezáleží, nemusí být bezpečné používat sdílené, měnitelné dlouhé a dvojité proměnné v vícevláknovém programu, pokud nejsou deklarovány jako volatilní nebo chráněné zámkem.
Když mluvíme o atomových operacích, znamená to, že čtení a psaní jsou atomové, například i=5; Je to atomová operace.
Pokud je však operace dvou atomů prováděna současně, nemusí být nutně atomová, například nejprve čtení a pak zápis, pak je možné, že proměnná byla po přečtení upravena.
i++ je taková operace, nejprve se čte a pak zapisuje, takže celočíselná proměnná je atomická, nikoli že i++ je atomická operace.
Když použijete for(int i=0; i<10000; i++){System.out.print(i)}
Zjistíte, že nakonec nevytisknu 10 000, ale asi 8–9 tisíc.
Ale v případě vícevláknového zpracování, i když je celočíselná proměnná atomická, mohou nastat problémy s bezpečností vláken, což je problém viditelnosti vláken, takže je potřeba přidat volatilní příkaz.
Tento modifikátor je nucená proměnná, která se pokaždé čte z paměti a není uložena v registrech. |