Synchronizacja w Javie | Wyjaśnione

Synchronizacja w Javie | Wyjaśnione
Kiedy zaczniemy dwa lub więcej wątków w tym samym programie, istnieje możliwość, że wiele wątków próbuje uzyskać dostęp do tego samego zasobu, w związku z czym powstanie niespójne wyniki. W celu zapewnienia wiarygodnej komunikacji między wieloma wątkami koncepcja synchronizacji jest używana w Javie. Synchronizowane słowo kluczowe w Javie synchronizuje działania wielu wątków i upewnia się, że tylko jeden wątek może uzyskać dostęp do określonego zasobu w określonym czasie.

Ten zapis będzie zbadał różne aspekty synchronizacji w Javie i pod tym względem ten artykuł obejmie następujące pojęcia:

  • Co to jest synchronizacja w Javie?
  • Dlaczego używana jest synchronizacja?
  • Dlaczego zsynchronizowane słowo kluczowe jest używane w Javie
  • Jak używać synchronizacji w Javie

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 ().

klasa wzajemna
int licznik;
public void incrementValue ()
licznik ++;


Synchronizacja klasy publicznej Example
public static void main (string [] args)
Countlass Count = new Storeclass ();
liczyć.incrementValue ();
System.na zewnątrz.println („licznik:” + liczenie.lada);

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:

klasa wzajemna
int licznik;
public void incrementValue ()
licznik ++;


Synchronizacja klasy publicznej Example
public static void main (string [] args) rzuca wyjątek
Countlass Count = new Storeclass ();
Wątek th1 = nowy wątek (nowy runnable ()
public void run ()
dla (int i = 1; i <= 10; i++)
liczyć.incrementValue ();


);
Th1.początek();
Th1.dołączyć();
System.na zewnątrz.println („licznik:” + liczenie.lada);

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 wzajemna
int licznik;
public void incrementValue ()
licznik ++;


Synchronizacja klasy publicznej Example
public static void main (string [] args) rzuca wyjątek
Countlass Count = new Storeclass ();
Wątek th1 = nowy wątek (nowy runnable ()
public void run ()
dla (int i = 1; i <= 500; i++)
liczyć.incrementValue ();


);
Wątek th2 = nowy wątek (nowy runnable ()
public void run ()
dla (int i = 1; i <= 500; i++)
liczyć.incrementValue ();


);
Th1.początek();
Th1.dołączyć();
th2.początek();
th2.dołączyć();
System.na zewnątrz.println („licznik:” + liczenie.lada);

Ponieważ 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:

public Synchronized void incrementValue ()
licznik ++;

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.