Multithreading - najważniejsze tematy i opis

0

Panowie,

Chce być biegły w temacie wielowatkowosci, jakie podtematy są najważniejsze i obecnie na topie? Np mamy możliwość tworzenia wątku przez runnable, callable lub Thread, executory? Strasznie to przytłacza. Kilka pytań, na które znalazłem odpowiedź, ale nie do końca ją rozumiem:

  1. Co to jest ThreadLocale albo raczej jaki jest praktyczny use case?
  2. Atomic variables? Po co? Co to daje? Jak to się ma do volitale
  3. Fork join a executor Service?
  4. Immutable, z góry robicie klasy w tym stylu? Ja np pracuje w projekcie sporym i nie widziałem, żeby ktoś się nad tym spinal
  5. Synchronized czy locki czy jeszcze coś?

No także tego, proszę o tłumaczenie obrazowe, będę wdzięczny, bo trochę mam już metlik w głowie związany z tym..

0
  1. bardzo popularny jest przesąd, który mówi że volatile wystarcza (np do inkrementacji zmiennych). NIE WYSTARCZA. Jeśli tak używasz w kodzie, to jest błąd, który bardzo trudno wykazać na testach, jak przyjdzie jego pora, to wyleci. Gwarancja 'volatile' dotyczy czego innego, każda dokumentacja tego słowa to opisuje (pierwsza pozycja z googla)
  2. dziwnie u was jest. Akurat moje myślenie o immutable mi podsuwa większą pewność algorytmów, ale na wątki "też pomaga"

ledwo pięć dni temu był wątek Java - multithreading
aha, generalnie wątki to nie jest coś "co się jest na topie", tylko się łączy z tą bardzo pokorną częścią życia programisty. "królu, w geometrii nie ma drogi specjalnej dla królów"

1
Bogaty Jeleń napisał(a):

Panowie,

Chce być biegły w temacie wielowatkowosci, jakie podtematy są najważniejsze i obecnie na topie? Np mamy możliwość tworzenia wątku przez runnable, callable lub Thread, executory? Strasznie to przytłacza. Kilka pytań, na które znalazłem odpowiedź, ale nie do końca ją rozumiem:

  1. Co to jest ThreadLocale albo raczej jaki jest praktyczny use case?

Z dokumentacji Javy "This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID). "

Czyli w skrócie: dany obiekt normalnie byłby współdzielony przez wątki z powodu zaimplementowania, ale jeśli to ThreadLocal, to każdy wątek dostanie własną, prywatną kopię

  1. Atomic variables? Po co? Co to daje? Jak to się ma do volitale

Volatile najczęściej oznacza "ulotny" i odnosi się do faktu, że wartość zmiennej (czy stan obiektu) może zmienić się w pamięci bez "wiedzy" procesora. Np. jeśli używasz DMA. Dlatego za każdym razem, gdy zechcesz z niej skorzystać, zostanie pobrana z pamięci zamiast z cache czy nawet rejestrów. Z kolei zmienna atomowa gwarantuje, że dostęp do jej reprezentacji w pamięci jest atomowy czyli niepodzielny, np. inkrementując licznik będziesz miał gwarancję że od wczytania kopii z pamięci do zapisu zinkrementowanej kopii z powrotem do pamięci nikt nie wejdzie Ci w paradę. Volatile w żaden sposób NIE gwarantuje, że dwa wątki nie pobiorą, zmodyfikują i zapiszą do pamięci tę samą zmienną w tym samym czasie, prowadząc do błędów. On tylko gwarantuje, że procesor nie będzie z lenistwa pracował na starej kopii.

  1. Fork join a executor Service?

bawiąc się w forki i joiny i całą resztę mówisz wprost, w jaki sposób chcesz doprowadzić do współbieżnego wykonania programu. korzystając z executorów, pól procesów i innych tego typu obiektów mówisz tylko, że to i to ma zostać wykonane gdzieś na boku, opcjonalnie że tyle i tyle razy, dla takich a takich porcji danych, korzystając z tylu i tylu core'ów naraz. Nie musisz zawracać sobie głowy tym, czy obiekt któremu zlecasz Runnable do wykonania będzie sobie chował uśpiony wątek i podsuwał mu taski, czy może każdy task będzie się wykonywał na osobnym wątku.

  1. Immutable, z góry robicie klasy w tym stylu? Ja np pracuje w projekcie sporym i nie widziałem, żeby ktoś się nad tym spinal

W zasadzie to w Javie zawodowo nie piszę, więc o dobrych praktykach niech się wypowie jakiś specjalista :)

  1. Synchronized czy locki czy jeszcze coś?

synchronized, locki, bariery, zmienne warunkowe - wszystko powstało po coś. Znowu - nie jestem specem od Javy, ale gdybym miał metody, które są dość krótkie i robią co chwila odczyty/zapisy stanu obiektu, to bym się nie bawił w locki i użył synchronized. Z kolei locków użyłbym, żeby zrobić sekcję krytyczną jedynie z fragmentu metody, jeśli zaszłaby taka potrzeba np. ze względu na np. czasochłonność jakiejś operacji, która mogłaby bezpiecznie zostać przed sekcją krytyczną. Jeśli np. chciałbym, aby możliwe było współbieżne odczytywanie stanu obiektu i wyłączny dostęp dla zapisu, użyłbym tzw. read-write locka.

No także tego, proszę o tłumaczenie obrazowe, będę wdzięczny, bo trochę mam już metlik w głowie związany z tym..

Starałem się jak mogłem, mam nadzieję że wystarczająco :o

0
  1. Zarządzanie transakcjami w Springu. Przy czym Spring robi to za Ciebie - ale "pod spodem" używa ThreadLocali
  2. AtomicVariable to jest po prostu użycie Compare And Swap. Volatile zapewnia widoczność pomiędzy wątkami. Przykładem AtomicVariable może
    być LongAdder wykorzystywany jako licznik współdzielony przez wątki
    3.Mechanizm Fork and Join to tak naprawde powiązanie "dziel i zwyciężaj" z wielowątkwością. Np. możesz wykorzystać to do zaimplementowania współbieżnego merge sorta - zadanie podzieli się na subtaski, posortuje mniejsze tablice w tych subtaskach a później złączy (właściwie tutaj będzie akurat RecursiveAction)
    4.Ja robię jak tylko mogę i nie ma przeciwskazań (tzn. można powiedziec że z defaultu). To nie jest związane tylko z programowaniem współbieżnym
    5.Synchronized to tak naprawde locki, tylko np . niestatyczna metoda synchronized to de facto methoda z lockiem na this (intrinsic lock)
1
  1. Thread local to po prostu miejsce do przechowywania danych związanych z danym wątkiem. Taki trochę session storage. Przydatne jeśli chcesz gdzieś wrzucić dane, tak zeby były dostępne dla innych klas w ramach tego samego wątku, bez potrzeby bawienia się w ręczne sprawdzanie w jakim wątku jesteś
  2. volatile daje ci tylko pewność odczytu, tzn że odczyt z takiej zmiennej pobierze akualną wartość a nie wartość z jakiegoś cache czy rejestru. Klasy Atomic dają ci pewność atomowych zapisów, tzn jeśli wiele wątków jednocześnie robi inkrementacje to wszystko poprawnie się tam zliczy, bo masz compare-and-swap.
  3. ForkJoinPool to jest szczególny przypadek Executora.
  4. Tak, gdzie sie tylko da. Jeśli jakieś obiekty są mutable to musi to wynikać z przemyślanej decyzji.
  5. Nie rozumiem trochę pytania. Jest wiele mechanizmów które przydaja się w różnych sytuacjach. Synchronized i locki to są takie najbardziej podstawowe mechanizmy, ale nie jedyne. Ja bym sie bardziej skupił nad immutable classes, zmiennych atomowych, kolekcjach które są synchronized/concurrent, a nie na niskopoziomowych zabawach. Jeśli ręcznie używasz locków i nie piszesz jakiegoś "frameworka" to jest to sygnał że coś jest nie tak.
0
Bogaty Jeleń napisał(a):
  1. Immutable, z góry robicie klasy w tym stylu? Ja np pracuje w projekcie sporym i nie widziałem, żeby ktoś się nad tym spinal

Immutable to dobry wybór do robienia różnego rodzaju DTO (Point, Pair, Account...). Nie musi to być związane z wielowątkowością.
Przydaje się np. żeby móc stwierdzić że wywoływana funkcja może mieć jakiś wpływ na kod wywołujący lub nie.

  1. Synchronized czy locki czy jeszcze coś?

Staram się używać podejścia shared-nothing (np. map-reduce w różnym wydaniu), więc raczej to "jeszcze coś".
Hasła do googlania: "message passing", "actor model concurrency".

2

Nie wiem czy na topie, ale warto znać podstawy i kojarzyć co doczytać/doszukać:

  1. Pojęcia:
  • lock
  • deadlock
  • race condition
  • live lock
  • starvation
  • thread contention
  • thread affinity
  • thread vs process
  • native threads vs green threads (N:M mapping)
  • cpu spinning
  1. Metody synchronizacji i komunikacji między wątkami/procesami:
  • sekcja krytyczna, semafor (różne rodzaje semaforów), mutex (futex), pipe, kolejka, socket, monitor
  1. Klasyczne problemy synchronizacji (i rozwiązania :-) )
  • producent-konsument
  • czytelnicy i pisarze
  • 5 filozofów
  • palacze
  • śpiący fryzjer
  1. JSR 133
0

Dzięki mordeczki, dowiedziałem się wszystkiego co chciałem od Was :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1