Jak mogę korzystać z AtomicBoolean i do czego służy ta klasa?
java
concurrency
yart
źródło
źródło
volatile boolean
vsAtomicBoolean
: stackoverflow.com/questions/3786825/…Odpowiedzi:
Gdy wiele wątków wymaga sprawdzenia i zmiany wartości logicznej. Na przykład:
To nie jest bezpieczne dla wątków. Możesz to naprawić za pomocą
AtomicBoolean
:źródło
true
kiedyinitialize()
nie został ukończony. Działa to tylko wtedy, gdy inne wątki nie dbają o zakończenieinitialize()
.initialized
jest po prostu używany, aby upewnić się, żeinitialize()
metoda wywoła tylko jeden wątek . Oczywiścieinitialized
fakt, że jest to prawda, nie oznacza, że inicjalizacja zdecydowanie zakończyła się w tym przypadku, więc być może nieco inny termin byłby lepszy. Znowu zależy to od tego, do czego jest używany.volatile boolean
samo jakAtomicBoolean
?synchronized
bloku, w którym to przypadku nie potrzebujesz jużAtomicBoolean
, tylkovolatile boolean
. (if(! this.initialized) { synchronized(this) { if(! this.initialized) { initialize(); this.initialized = true; } } }
upewni się, że zadzwoni tylko jeden wątekinitialize
i że wszystkie pozostałe wątki będą na niego czekać, pod warunkiem, żeinitialized
jest zaznaczonyvolatile
.)Oto notatki (z książki Briana Goetza ), które zrobiłem, które mogą ci pomóc
Klasy AtomicXXX
zapewniają nieblokującą implementację porównania i zamiany
Korzysta ze wsparcia zapewnianego przez sprzęt (instrukcja CMPXCHG na temat Intela) Gdy wiele wątków przepływa przez Twój kod korzystający z interfejsu API współbieżności atomowej, będą one skalowane znacznie lepiej niż kod korzystający z monitorów / synchronizacji na poziomie obiektu. Ponieważ mechanizmy synchronizacji Javy powodują, że kod czeka, gdy wiele krytycznych sekcji przebiega przez wiele wątków, znaczna część czasu procesora jest poświęcana na zarządzanie samym mechanizmem synchronizacji (oczekiwanie, powiadamianie itp.). Ponieważ nowy interfejs API wykorzystuje konstrukcje sprzętowe (zmienne atomowe) oraz algorytmy oczekiwania i blokowania w celu wdrożenia bezpieczeństwa wątków, dużo więcej czasu procesora spędza się na „robieniu rzeczy” niż na zarządzaniu synchronizacją.
nie tylko oferują lepszą przepustowość, ale także zapewniają większą odporność na problemy z żywotnością, takie jak impas i inwersja priorytetów.
źródło
Istnieją dwa główne powody, dla których można użyć boolean atomowych. Po pierwsze, można go modyfikować, możesz przekazać go jako odniesienie i zmienić na przykład wartość powiązaną z samą wartością logiczną.
oraz w klasie someObject
Co ważniejsze, jego wątek jest bezpieczny i może wskazywać deweloperom utrzymującym klasę, że oczekuje się, że zmienna ta zostanie zmodyfikowana i odczytana z wielu wątków. Jeśli nie używasz AtomicBoolean, musisz zsynchronizować używaną zmienną boolowską, deklarując jej zmienność lub synchronizując odczyt i zapis pola.
źródło
AtomicBoolean
Klasa daje wartość logiczną, które można aktualizować atomowo. Użyj go, gdy masz wiele wątków uzyskujących dostęp do zmiennej boolean.Java.util.concurrent.atomic przegląd pakiet daje dobry opis na wysokim poziomie, co zajęcia w tym pakiecie zrobić i kiedy ich używać. Poleciłbym również książkę Java Concurrency in Practice autorstwa Briana Goetza.
źródło
Fragment opisu pakietu
źródło