Wiedza, np. 1-minutowa autoprezentacja na potrzeby rozmowy kwalifikacyjnej
„Jaka jest różnica między procesem a wątkiem?”
Kiedy szukałem pracy, to pytanie zawsze znajdowało się na liście „10 najczęstszych pytań na rozmowach kwalifikacyjnych”. Odpowiedziałem jak maszyna.
„Proces to działający program, a wątek to jednostka przepływu wykonywana w ramach procesu. Procesy nie współdzielą zasobów, ale wątki współdzielą zasoby.”
Prowadzący rozmowę skinął głową i założyłem, że doskonale rozumiem tę koncepcję. Jednak dopóki w praktyce nie zetknąłem się z „kwestią współbieżności”, nie miałem pojęcia, jaka prawdziwa obawa kryje się w tym zdaniu.
„Dlaczego liczba wyświetleń ma wzrosnąć o 100, a wzrosła tylko o 98?” „Dlaczego witryna zatrzymuje się, gdy pobieram Excel?”
Mój kod był doskonały, gdy uruchamiałem go samodzielnie, ale powstał bałagan, gdy jednocześnie korzystało z niego wielu użytkowników. Myślałem, że można to rozwiązać, po prostu zwiększając liczbę „pracowników”, ale nie wiedziałem, że wraz ze wzrostem liczby pracowników koszt zarządzania nimi (przełączanie kontekstu) rośnie wykładniczo.

Fabryka i pracownicy w cyfrowym centrum logistycznym
Powróćmy do naszego światopoglądu „cyfrowego centrum logistycznego”. Uruchamianie programu na komputerze przypomina konfigurowanie „fabryki” w centrum dystrybucyjnym.
1. Proces: Niezależne miejsce pracy
2. Temat: Pracownicy w warsztacie

[Weryfikacja kodu] Tragedia podczas udostępniania (problem współbieżności)
„Wątki współdzielą zasoby.” W pokoju przesłuchań może to wydawać się zaletą, ale w praktyce może być zalążkiem „katastrofy”.
Czy pamiętasz „Stertę”, której nauczyliśmy się ostatnim razem? Wątki współdzielą ten obszar sterty. Oznacza to, że wątek B może przyjść i zastąpić dane, nad którymi pracuje wątek A.
Nazywa się to „warunkami wyścigu”. Sprawdźmy to za pomocą kodu.
public class RaceConditionTest {
static int count = 0; // Zmienna dzielona przechowywana w Stercie (Heap)
public static void main(String[] args) throws InterruptedException {
// Zatrudnij dwoch pracownikow (watki)
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) count++;
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) count++;
});
t1.start(); // Rozpocznij prace!
t2.start(); // Rozpocznij prace!
t1.join(); // Czekaj, az zakoncza prace
t2.join(); // Czekaj, az zakoncza prace
System.out.println("Wynik koncowy: " + count);
}
}
Oczekiwany wynik: ponieważ dwie osoby dodały 10 000 razy, wynik powinien wynosić 20 000.
Rzeczywisty wynik: 15 482, 18 931… Wartość jest inna za każdym razem, gdy ją uruchamiam, a 20 000 nie jest wyświetlane.
Powód:
To jest istota błędu polegającego na tym, że w praktyce „czasami dane są przeżuwane”. To tragedia, która wydarzyła się, gdy pracownicy dotknęli tej samej księgi, nie rozmawiając ze sobą.
Jeśli porównamy tę sytuację z bazą danych (DB), będzie to to samo, co „sytuacja, w której wiele zapytań jest przesyłanych jednocześnie bez transakcji”. Jeśli saldo konta bankowego zostanie jednocześnie zmodyfikowane bez blokady, nastąpi straszny wypadek, w wyniku którego pieniądze wyparują. Tak jak chronimy dane za pomocą ROLLBACK lub COMMIT w bazie danych, tak urządzenie blokujące, takie jak Synchronized, jest absolutnie niezbędne na poziomie kodu.
Kompromis w praktyce: wieloprocesowość vs. wielowątkowość
Kiedy i czego używać w praktyce?
1. Najlepsza przeglądarka Chrome: wieloprocesowa
W starej przeglądarce Internet Explorer zatrzymanie jednej karty powodowało zamknięcie całej przeglądarki (metoda wielowątkowa). Jednak Chrome uruchamia każdą kartę jako „oddzielny proces (fabryczny)”.
2. Wybór serwera WWW (Spring, Node.js itp.): Wielowątkowy
Serwer musi obsłużyć tysiące żądań. Jeśli zbudujesz proces (fabrykę) dla każdego żądania, serwer ulegnie awarii. Jest więc przetwarzany poprzez umieszczenie wielu wątków (procesów roboczych) w jednym procesie.

Zakończenie: Samospalenie wiąże się z odpowiedzialnością
Dzisiaj przyjrzeliśmy się „procesom i wątkom”, czyli sposobowi pracy pracowników.
Teraz już wiesz, że termin „problemy współbieżności” nie odnosi się tylko do rozmowy kwalifikacyjnej. Wielu pracowników wątku stale przemieszcza się do i z wspólnego magazynu zwanego Stertą. Zaprowadzenie porządku w tym chaosie to umiejętność programisty zaplecza.
Ale poczekaj, jeśli jest wielu pracowników, jak decydujesz, kto powinien wykonać czyją pracę jako pierwszy? W jaki sposób kierownik fabryki (OS) zarządza setkami pracowników? Następnym razem porozmawiamy o najbardziej kłopotliwym zadaniu kierownika fabryki, „Planowaniu i przełączaniu kontekstu”.