W Javie pozostałe podstawowe zmienne są atomowe, z wyjątkiem 8-bajtowych, 64-bitowych zmiennych Long i Double.
Model pamięci Java wymaga, aby zarówno operacje get, jak i store były atomowe, ale dla nieulotnych zmiennych długich i podwójnych JVM pozwala na podzielenie 64-bitowego odczytu lub zapisu na dwie operacje 32-bitowe.
Jeśli odbywają się odgłosy odczytu i zapisu na różnych wątkach, odczyt długiego typu nieulotnego może skutkować wysoką liczbą 32 bitów jednej wartości i niskimi 32 bitami drugiej.
Więc nawet jeśli nie zależy Ci na wygasłych danych, może nie być bezpieczne używać współdzielonych, zmiennych długich i podwójnych w programie wielowątkowym, chyba że zostaną uznane za zmienne lub chronione blokadą.
Mówiąc o operacjach atomowych, oznacza to, że czytanie i zapisywanie są atomowe, na przykład i=5; To operacja atomowa.
Jednak jeśli działanie dwóch atomów odbywa się razem, niekoniecznie jest to atomowe, na przykład najpierw odczyt, a potem zapis, to możliwe, że zmienna została zmodyfikowana po odczytaniu.
i++ jest taką operacją, najpierw odczyta, a następnie zapisu, więc zmienna całkowita jest atomowa, a nie że i++ jest operacją atomową.
Gdy używasz for(int i=0; i<10000; i++){System.out.print(i)}
Zobaczysz, że ostatecznie nie wydrukuję 10 000, a wydrukuję około 8-9 tysięcy.
Ale w przypadku wielowątkowania, nawet jeśli zmienna całkowita jest atomowa, mogą wystąpić problemy z bezpieczeństwem wątków, co jest problemem widoczności wątków, więc trzeba dodać polecenie lotności.
Ten modyfikator jest wymuszoną zmienną, która jest odczytywana z pamięci za każdym razem i nie jest przechowywana w rejestrach. |