Kurs Java

Współbieżność strukturalna w Javie 19

Dokładnie za dwa tygodnie, czyli 20 września pojawi się kolejna wersja Javy - Java 19. Jedną z przygotowywanych nowości, która znajduje się fazie inkubacji, jest tzw. współbieżność strukturalna. Brzmi interesująco, ale co tak naprawdę oznacza to intrygujące pojęcie?
Appa Notka. Inkubator zawiera obecnie rozwijane rozwiązania, co powoduje, że kod (w tym interfejsy API) dostarczane w ręce programistów są niekompletne, a prace nad nimi stale postępują w kierunku finalizacji lub usunięcia w przyszłej wersji. Kod znajduje się pakiecie jdk.incubator.
Współbieżność strukturalna ma na celu uproszczenie programowania wielowątkowego za pomocą strukturalnego interfejsu API dedykowanego współbieżności. Traktuje ona wiele zadań działających w różnych wątkach jako pojedynczą jednostkę pracy, usprawniając w ten sposób obsługę i anulowanie błędów. W zwykłym kodzie jednowątkowym zadania są wykonywane sekwencyjnie (nowe zadanie jest wykonywane dopiero po zakończeniu obecnego). Jeśli jednak zadania są wystarczająco niezależne od siebie i jeśli istnieją wystarczające zasoby sprzętowe, cały proces (wszystkie zadania) można uruchomić szybciej (tj. z mniejszym opóźnieniem), wykonując je jednocześnie. Na przykład, jeśli cały proces składa się z kilku operacji wejścia/wyjścia (in/out), będzie on wykonany szybciej, jeśli każda operacja in/out zostanie wykonana w tym samym czasie, ale w odrębnych wątkach.

Wątki wirtualne

Inne rozwiązanie, będące w Javie 19 w podglądzie (preview) i funkcjonujące pod nazwą wirtualne wątki sprawia, że dedykowanie wątku do każdej takiej operacji in/out staje się opłacalne. Niemniej zarządzanie ogromną liczbą wątków, pozostaje wyzwaniem. Jeśli istnieje jakakolwiek korelacja pomiędzy wątkami i jeśli jeden z nich zakończy się błędem, to zakończenie powiązanego z nim wątku może nie być dobrym rozwiązaniem. Zatem możemy chcieć powiązać dwa wątki ze sobą tak, aby jednak w jakiś sposób potrafiły reagować wzajemnie na swoje zachowania. Obecnie można to zaprogramować ręcznie, ale im więcej zależności tym jest to bardziej nieczytelne. Tutaj z pomocą przychodzi strukturalna współbieżność.

Ogólna zasada jest taka, że jeśli proces zostanie podzielony na współbieżne zadania, wszystkie wracają do tego samego miejsca, a mianowicie do bloku kodu procesu. W takiej ustrukturyzowanej współbieżności zadania działają w imieniu procesu. Oczekuje on na wyniki zadań i monitoruje je pod kątem błędów. Podobnie jak w przypadku technik programowania strukturalnego dla kodu w jednym wątku, siła strukturalnej współbieżności dla wielu wątków pochodzi z dwóch pomysłów:
  • dobrze zdefiniowane punkty wejścia i wyjścia dla przepływu wykonywania przez blok kodu
  • ścisłe zagnieżdżanie czasów życia operacji w sposób, który odzwierciedla ich zagnieżdżanie składniowe w kodzie
Ze względu na to, że punkty wejścia i wyjścia bloku kodu są dobrze zdefiniowane, czas życia współbieżnego zadania jest ograniczony do bloku składniowego jego procesu. Tak samo czasy życia wszystkich zadań procesu są zawarte w ramach całości tego procesu, więc zadania te można traktować i zarządzać jako jednostkę.

W ten sposób środowisko wykonawcze może przekształcić hierarchię zadań procesu w drzewo, a ono jest równoczesnym odpowiednikiem stosu wywołań pojedynczego wątku. Narzędzia do obserwacji mogą go używać do przedstawiania zadań jako podrzędnych względem całości procesu.

Współbieżność strukturalna doskonale pasuje do wątków wirtualnych, które są lekkimi wątkami zaimplementowanymi przez JDK. Wiele wątków wirtualnych współdzieli ten sam wątek systemu operacyjnego, co pozwala na bardzo dużą liczbę wątków wirtualnych.

Wątki wirtualne są wystarczająco tanie, aby reprezentować dowolną współbieżną jednostkę zachowania, nawet zachowanie obejmujące in/out. Oznacza to, że aplikacja serwera może wykorzystywać ustrukturyzowaną współbieżność do przetwarzania tysięcy lub milionów przychodzących żądań jednocześnie:
  • może dedykować nowy wątek wirtualny do procesu obsługi każdego żądania, a gdy proces rozgałęzia się, przesyłając zadania do jednoczesnego wykonania
  • może dedykować nowy wątek wirtualny do każdego zadania w ramach procesu
Za kulisami relacja proces-zadanie (możemy też powiedzieć zadanie-podzadanie) jest ponownie przekształcana w drzewo poprzez ustawienie, w którym każdy wątek wirtualny ma odniesienie do swojego unikalnego rodzica, podobnie jak ramka w stosie wywołań odnosi się do swojego unikalnego wywołującego.

Podsumowując, rozwiązanie wirtualne wątki pozwala na dostarczenie ogromnej ilości wątków. Współbieżność strukturalna zapewnia ich prawidłową i niezawodną koordynację oraz umożliwia narzędziom do obserwacji wyświetlanie wątków w sposób, w jaki są one rozumiane przez programistę. Posiadanie API dla ustrukturyzowanej współbieżności w JDK poprawi zdecydowanie łatwość konserwacji oraz niezawodność i obserwowalność aplikacji serwerowych.
Autor: Jarek Klimas
Data: 06 września 2022
Labele:Backend, Poziom średniozaawansowany, Java
Masz swoje przemyślenia na temat artykułu? Podziel się nimi!
Masz pytanie odnośnie zagadnienia omawianego w artykule?
Coś, co napisaliśmy, nie zaspokoiło Twojego głodu wiedzy?
Daj nam znać co myślisz i skomentuj artykuł na facebooku!

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE