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:
- 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ę
- 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.
- 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.
- 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 :)
- 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