Ten zapis będzie zbadał różne aspekty synchronizacji w Javie i pod tym względem ten artykuł obejmie następujące pojęcia:
Więc weźmy
Co to jest synchronizacja w Javie?
Jest to proces, który kontroluje dostęp więcej niż jeden wątek do dowolnego wspólnego zasobu, a zatem unika niespójnych wyników.
Dlaczego używana jest synchronizacja?
W Javie głównym celem zastosowania synchronizacji jest unikanie niespójnego zachowania wątków i zapobieganie zakłóceniu wątków.
Dlaczego zsynchronizowane słowo kluczowe jest używane w Javie
Synchronizacja jest modyfikatorem, który można zastosować tylko do metod i bloków i nie można go zastosować na zmiennych i klasach. Zrozumieć tę koncepcję
Jak używać synchronizacji w Javie
Rozważymy kilka przykładów głębokiego zrozumienia. Początkowo stworzymy bardzo prosty program Java, aby zwiększyć wartość licznika. Następnie rozszerzymy ten przykład na wielowa scenariusz. Stopniowo zmierzymy się w kierunku synchronizacji, w której dowiemy się, dlaczego zsynchronizowane słowo kluczowe jest używane w Javie?
Przykład
W tym przykładzie utworzymy prosty program, który ma zmienną lada i funkcja zdefiniowana przez użytkownika incrementValue ().
Ilekroć wywołujemy incrementValue () zwiększy wartość lada o 1:
Wartość licznika jest skutecznie zwiększana do 1, co pokazuje odpowiedniość naszego programu. Jeśli zadzwonimy incrementValue () metoda dwa razy, a następnie wartość licznika 2. Podobnie pokaże wartość licznika jako 3, jeśli zadzwonimy incrementValue () metoda trzykrotnie, jak pokazano na poniższym fragmencie:
W powyższym fragmencie kodu wywołaliśmy incrementValue () metoda cztery razy, więc pokazuje wartość licznika jako 4.
Przykład
Teraz rozszerzymy powyższy przykład trochę, w którym utworzymy wątek, który wywoła incrementValue () dziesięć razy:
W powyższej metodzie Code-Snippet () jest używana z obiektem klasy wątków, aby jeden wątek poczekał, aż drugi wątek zakończy wykonanie. Powyższy kod-snippet daje następujące dane wyjściowe:
Ze wyjścia jasno wynika, że wątek wywołuje incrementValue () Dziesięć razy, a zatem wartość licznika jest równa dziesięciu.
Jak dotąd tak dobrze, teraz rozważmy wieloosobowe środowisko i stwórz jeszcze jeden wątek, aby zobaczyć, co się stanie, gdy dwa wątki wymagają tego samego zasobu (i.mi. incrementValue () metoda) jednocześnie.
Przykład
W tym przykładzie mamy dwa wątki oba wywołają metodę IncrementValue () pięćset razy:
klasa wzajemnaPonieważ oba wątki nazywają kontratak () pięćset razy, technicznie wartość przyrostu powinna wynosić tysiąc. Rozważmy poniższy fragment, aby zobaczyć, co mówi wyjście:
Zamiast „1000” otrzymujemy „753”, co to znaczy? Dlaczego nie otrzymaliśmy wartości licznika jako 1000?
Cóż, dzieje się tak, ponieważ wielowytwórstwo obsługuje przetwarzanie równoległe, a zatem zawsze istnieje możliwość, że oba wątki przyciągają wartość licznika w tym samym czasie, a zatem oba otrzymają tę samą wartość licznika, w takim przypadku zamiast zwiększać wartość licznika dwa razy, zwiększa się tylko raz.
Jak więc uniknąć takiego scenariusza? Dobrze! W takich przypadkach zostanie użyte zsynchronizowane słowo kluczowe.
Przykład
Użyjemy zsynchronizowanego słowa kluczowego z „incrementValue ()„Metoda w rezultacie tylko jeden wątek dostęp do„incrementValue ()”Metoda kiedyś. Cały kod pozostanie taki sam, jak w poprzednim przykładzie, zsynchronizowane słowo kluczowe zostanie dodane metodą incrementValue (), jak pokazano w fragmencie:
Teraz, jeśli wątek 1 działa z incrementValue () Metoda, a następnie wątek 2 będzie czekał i odwrotnie. Tym razem otrzymamy następujące dane wyjściowe:
Powyższy fragment pokazuje skuteczność „synchronizowanego” słowa kluczowego.
Wniosek
Synchronizacja to proces kontrolujący dostęp do więcej niż jednego wątku i upewnia się, że tylko jeden wątek może uzyskać dostęp do zasobu w określonym czasie. Aby osiągnąć synchronizację, używane jest zsynchronizowane słowo kluczowe/modyfikator i można go zastosować do metod i bloków, ale nie można go zastosować do zmiennych i klas. W Javie głównym celem zastosowania synchronizacji jest unikanie niespójnego zachowania wątków i zapobieganie zakłóceniu wątków.