CodeGym/Kursy Java/Moduł 3/Biblioteka współbieżności Java

Biblioteka współbieżności Java

Dostępny

Wielowątkowość w Javie

Wirtualna maszyna Java obsługuje przetwarzanie równoległe . Wszystkie obliczenia mogą być wykonywane w kontekście jednego lub kilku wątków. Możemy łatwo skonfigurować dostęp do tego samego zasobu lub obiektu dla wielu wątków, a także skonfigurować wątek do wykonania pojedynczego bloku kodu.

Każdy programista musi synchronizować pracę z wątkami podczas operacji odczytu i zapisu dla zasobów, do których przydzielono wiele wątków.

Ważne jest, aby w momencie dostępu do zasobu mieć aktualne dane, aby inny wątek mógł je zmienić i uzyskać najbardziej aktualne informacje. Nawet jeśli weźmiemy przykład konta bankowego, dopóki pieniądze na niego nie wpłyną, nie można z niego korzystać, dlatego ważne jest, aby zawsze mieć aktualne dane. Java ma specjalne klasy do synchronizacji wątków i zarządzania nimi.

Obiekty wątków

Wszystko zaczyna się od głównego (głównego) wątku, czyli przynajmniej Twój program ma już jeden działający wątek. Główny wątek może tworzyć inne wątki przy użyciu Callable lub Runnable . Kreacja różni się tylko zwracanym wynikiem, Runnable nie zwraca wyniku i nie może rzucić sprawdzonego wyjątku. Masz więc dobrą okazję do zbudowania wydajnej pracy z plikami, ale jest to bardzo niebezpieczne i musisz być ostrożny.

Możliwe jest również zaplanowanie wykonywania wątków na oddzielnym rdzeniu procesora. System może łatwo przemieszczać się między wątkami i wykonywać konkretny wątek z odpowiednimi ustawieniami: czyli najpierw wykonywany jest wątek, który odczytuje dane, jak tylko mamy dane, to przekazujemy je do wątku odpowiedzialnego za walidację, następnie przekazujemy go do wątku, aby wykonać logikę biznesową, a nowy wątek zapisuje je z powrotem. W takiej sytuacji 4 wątki po kolei przetwarzają dane i wszystko będzie działać szybciej niż jeden wątek. Każdy taki strumień jest konwertowany na natywny strumień systemu operacyjnego, ale sposób konwersji zależy od implementacji maszyny JVM.

Klasa Thread służy do tworzenia wątków i pracy z nimi. Posiada standardowe mechanizmy kontrolne, jak również abstrakcyjne, takie jak klasy i kolekcje z java.util.concurrent .

Synchronizacja wątków w Javie

Komunikacja odbywa się poprzez współdzielenie dostępu do obiektów. Jest to bardzo skuteczne, ale jednocześnie bardzo łatwo popełnić błąd podczas pracy. Błędy pojawiają się w dwóch przypadkach: interferencja wątku — gdy inny wątek zakłóca twój wątek, oraz błędy spójności pamięci — spójność pamięci. Aby rozwiązać i zapobiec tym błędom, mamy różne metody synchronizacji.

Synchronizacja wątków w Javie jest obsługiwana przez monitory, jest to mechanizm wysokiego poziomu, który pozwala tylko jednemu wątkowi na wykonanie w danym momencie bloku kodu chronionego przez ten sam monitor. Zachowanie monitorów jest rozpatrywane w kategoriach blokad; jeden monitor - jeden zamek.

Synchronizacja ma kilka ważnych punktów, na które należy zwrócić uwagę. Pierwszym punktem jest wzajemne wykluczanie — tylko jeden wątek może być właścicielem monitora, dlatego synchronizacja na monitorze oznacza, że ​​gdy jeden wątek wejdzie do zsynchronizowanego bloku chronionego przez monitor, żaden inny wątek nie może wejść do bloku chronionego przez monitor. pierwszy wątek opuszcza zsynchronizowany blok. Oznacza to, że wiele wątków nie może uzyskać dostępu do tego samego zsynchronizowanego bloku w tym samym czasie.

Ale synchronizacja to nie tylko wzajemne wykluczanie się. Synchronizacja zapewnia, że ​​dane zapisane w pamięci przed zsynchronizowanym blokiem lub w jego obrębie staną się widoczne dla innych wątków synchronizowanych na tym samym monitorze. Po wyjściu z bloku puszczamy monitor i inny wątek może go chwycić i rozpocząć wykonywanie tego bloku kodu.

Kiedy nowy wątek przechwytuje monitor, uzyskujemy dostęp i możliwość wykonania tego bloku kodu, aw tym momencie zmienne zostaną załadowane z pamięci głównej. Wtedy możemy zobaczyć wszystkie wpisy uwidocznione przez poprzednią wersję monitora.

Odczyt-zapis na polu jest operacją atomową, jeśli pole jest zadeklarowane jako ulotne lub chronione przez unikalną blokadę uzyskaną przed jakimkolwiek odczytem-zapisem. Ale jeśli nadal napotykasz błąd, pojawia się błąd dotyczący zmiany kolejności (zmiana kolejności, zmiana kolejności). Przejawia się to w źle zsynchronizowanych programach wielowątkowych, gdzie jeden wątek może obserwować efekty, które wytwarzają inne wątki.

Efekt wzajemnego wykluczania się i synchronizacji wątków, czyli ich poprawne działanie uzyskuje się tylko poprzez wprowadzenie zsynchronizowanego bloku lub metody, która implicite uzyskuje blokadę, lub przez jawne uzyskanie blokady. Porozmawiamy o tym poniżej. Oba sposoby pracy wpływają na twoją pamięć i ważne jest, aby nie zapominać o pracy ze zmiennymi lotnymi .

Zmienne pola w Javie

Jeśli zmienna jest oznaczona jako volatile , jest dostępna globalnie. Oznacza to, że jeśli wątek uzyskuje dostęp do zmiennej lotnej , otrzyma jej wartość przed użyciem wartości z pamięci podręcznej.

Zapis działa jak zwolnienie monitora, a odczyt działa jak przechwytywanie monitora. Dostęp odbywa się w relacji typu „wykonany przed”. Jeśli to rozgryziesz, wszystko, co będzie widoczne dla wątku A podczas uzyskiwania dostępu do zmiennej nietrwałej , będzie zmienną dla wątku B. Oznacza to, że masz gwarancję, że nie utracisz zmian wprowadzonych w innych wątkach.

Zmienne lotne są atomowe, to znaczy przy czytaniu takiej zmiennej stosuje się ten sam efekt, co przy uzyskiwaniu blokady - dane w pamięci są deklarowane jako nieważne lub niepoprawne, a wartość zmiennej lotnej jest ponownie odczytywana z pamięci . Podczas zapisywania używany jest efekt na pamięć, a także podczas zwalniania blokady - do pamięci zapisywane jest pole ulotne .

Java współbieżna

Jeśli chcesz stworzyć superwydajną i wielowątkową aplikację, musisz skorzystać z klas z biblioteki JavaConcurrent , które znajdują się w pakiecie java.util.concurrent .

Biblioteka jest bardzo obszerna i ma różne funkcje, więc spójrzmy, co jest w środku i podzielmy to na kilka modułów:

Java współbieżna

Kolekcje współbieżne to zestaw kolekcji do pracy w środowisku wielowątkowym. Zamiast podstawowego wrappera Collections.synchronizedList z blokowaniem dostępu do całej kolekcji stosowane są blokady na segmentach danych lub stosowane są algorytmy typu wait-free do równoległego odczytu danych.

Kolejki - kolejki nieblokujące i blokujące do pracy w środowisku wielowątkowym. Kolejki nieblokujące skupiają się na szybkości i działaniu bez blokowania wątków. Kolejki blokujące nadają się do pracy, gdy trzeba „spowolnić” wątki Producer lub Consumer . Na przykład w sytuacji, gdy któryś z warunków nie jest spełniony, kolejka jest pusta lub pełna, albo nie ma wolnego Konsumenta .

Synchronizery to narzędzia narzędziowe do synchronizacji wątków. Są potężną bronią w obliczeniach „równoległych”.

Executors to framework do wygodniejszego i łatwiejszego tworzenia pul wątków, łatwo jest skonfigurować harmonogramowanie zadań asynchronicznych z uzyskiwaniem wyników.

Blokady to wiele elastycznych mechanizmów synchronizacji wątków w porównaniu do podstawowych zsynchronizowanych , czekania , powiadamiania , powiadamiania wszystkich .

Atomics to klasy, które mogą obsługiwać operacje atomowe na prymitywach i odwołaniach.

Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy