Przewodnik po synchronizacji w Javie

Opublikowany: 2022-10-23

Zanim wyjaśnimy synchronizację w Javie , musimy pokrótce przyjrzeć się koncepcji wielowątkowości. Funkcja wielowątkowości Javy umożliwia jednoczesne wykonanie dwóch lub więcej części programu w celu maksymalnego wykorzystania procesora. Każda część takiego programu jest wątkiem, a wątki są lekkimi procesami w ramach procesu.

Teraz wiele wątków programu może próbować uzyskać dostęp do tych samych zasobów i dawać niedokładne wyniki. Musi więc istnieć pewna synchronizacja, aby zapewnić, że tylko jeden wątek ma dostęp do zasobów w danym momencie.

Sprawdź nasze bezpłatne kursy technologiczne, aby uzyskać przewagę nad konkurencją.

W tym przewodniku na temat tego, czym jest synchronizacja w Javie , szczegółowo omówimy koncepcję synchronizacji na przykładach.

Ucz się kursów rozwoju oprogramowania online z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.

Spis treści

Co to jest synchronizacja w Javie?

Synchronizacja Java to możliwość kontrolowania dostępu wielu wątków do współużytkowanego zasobu. Jest to przydatne, gdy wielowątkowe programy Java próbują uzyskać dostęp do tego samego zasobu i generują błędne wyniki. Korzystając z funkcji synchronizacji Java, tylko jeden wątek może uzyskać dostęp do zasobu w danym momencie.

Java zapewnia sposób synchronizowania zadań wątków za pomocą zsynchronizowanych bloków, które synchronizują się na tym samym obiekcie i mogą mieć w sobie jednocześnie wykonywany tylko jeden wątek. Bloki te są oznaczone słowem kluczowym syncd, które blokuje każdy inny wątek próbujący dostać się do bloku synchronizowanego, dopóki wątek znajdujący się już wewnątrz bloku nie zakończy wykonywania i opuści blok.

Sprawdź zaawansowaną certyfikację upGrad w DevOps

Składnia do pisania zsynchronizowanego bloku

Ogólna składnia pisania zsynchronizowanego bloku w Javie jest następująca:

zsynchronizowany( lockObject )

{

// zsynchronizowane instrukcje

}

Poznaj nasze popularne kursy inżynierii oprogramowania

Master of Science in Computer Science z LJMU i IIITB Program certyfikacji cyberbezpieczeństwa Caltech CTME
Pełny Bootcamp rozwoju stosu Program PG w Blockchain
Program Executive PG w pełnym rozwoju stosu
Zobacz wszystkie nasze kursy poniżej
Kursy inżynierii oprogramowania

W powyższej składni lockObject odnosi się do obiektu, którego blokada jest związana z synchronizowanymi elementami. To prowadzi nas do koncepcji blokady w Javie.

Sprawdź zaawansowaną certyfikację upGrad w zakresie bezpieczeństwa cybernetycznego

Blokady w Javie

Synchronizacja w Javie jest zbudowana wokół blokady lub monitora. Każdy obiekt ma przypisaną blokadę. W idealnym przypadku wątek, który wymaga dostępu do pól obiektu, musi najpierw uzyskać blokadę obiektu. Zamek jest bardziej wyrafinowanym i elastycznym mechanizmem synchronizacji wątków niż blok synchronizacji. Jest on zdefiniowany w pakiecie java.util.concurrent.lock zawierającym rozbudowane implementacje blokad.

Umiejętności tworzenia oprogramowania na żądanie

Kursy JavaScript Podstawowe kursy języka Java Kursy na temat Struktury danych
Kursy Node.js Kursy SQL Kursy rozwoju pełnego stosu
Kursy NFT Kursy DevOps Kursy Big Data
Kursy React.js Kursy na temat bezpieczeństwa cybernetycznego Kursy na temat przetwarzania w chmurze
Kursy projektowania baz danych Kursy Pythona Kursy kryptowalut

Zsynchronizowana metoda Java

Celem zsynchronizowanej metody Java jest zablokowanie obiektów dla udostępnionych zasobów. W związku z tym, gdy wątki wywołują zsynchronizowaną metodę, metoda automatycznie pobiera blokadę dla tego obiektu i zwalnia ją, gdy wątek wykona swoje zadanie.

Oto przykład zsynchronizowanej metody Java:

//przykład zsynchronizowanej metody java

klasa Tabela{

synced void printTable(int n){//zsynchronizowana metoda

for(int i=1;i<=5;i++){

System.out.println(n*i);

próbować{

Wątek.uśpienie(400);

}catch(Wyjątek e){System.out.println(e);}

}

}

}

class MyThread1 rozszerza Thread{

Tablet;

MójWątek1(Tabela t){

to.t=t;

}

publiczne void run(){

t.printTable(5);

}

}

class MyThread2 rozszerza Thread{

Tablet;

MójWątek2(Tabela t){

to.t=t;

}

publiczne void run(){

t.printTable(100);

}

}

public class TestSynchronization2{

public static void main(String args[]){

Table obj = new Table();//tylko jeden obiekt

MójWątek1 t1=nowy MójWątek1(obj);

MójWątek2 t2=nowy MójWątek2(obj);

t1.start();

t2.start();

}

}

Przeczytaj nasze popularne artykuły związane z tworzeniem oprogramowania

Jak zaimplementować abstrakcję danych w Javie? Co to jest klasa wewnętrzna w Javie? Identyfikatory Java: definicja, składnia i przykłady
Zrozumienie enkapsulacji w OOPS z przykładami Wyjaśnienie argumentów wiersza poleceń w języku C 10 najważniejszych funkcji i cech chmury obliczeniowej w 2022 r.
Polimorfizm w Javie: pojęcia, typy, charakterystyka i przykłady Pakiety w Javie i jak ich używać? Git Tutorial dla początkujących: Naucz się Gita od podstaw

Wyjście:

5

10

15

20

25

100

200

300

400

500

Co się dzieje bez synchronizacji?

Spójrzmy teraz na poprzedni program bez synchronizacji (zwróć uwagę na brak słowa kluczowego synchronizowanego).

klasa Tabela{

void printTable(int n){//metoda niezsynchronizowana

for(int i=1;i<=5;i++){

System.out.println(n*i);

próbować{

Wątek.uśpienie(400);

}catch(Wyjątek e){System.out.println(e);}

}

}

}

class MyThread1 rozszerza Thread{

Tablet;

MójWątek1(Tabela t){

to.t=t;

}

publiczne void run(){

t.printTable(5);

}

}

class MyThread2 rozszerza Thread{

Tablet;

MójWątek2(Tabela t){

to.t=t;

}

publiczne void run(){

t.printTable(100);

}

}

klasa TestSynchronizacja1{

public static void main(String args[]){

Table obj = new Table();//tylko jeden obiekt

MójWątek1 t1=nowy MójWątek1(obj);

MójWątek2 t2=nowy MójWątek2(obj);

t1.start();

t2.start();

}

}

Wyjście:

5

100

10

200

15

300

20

400

25

500

Jak widać, bez synchronizacji dane wyjściowe są niespójne.

Rodzaje synchronizacji w Javie

Aby odpowiedzieć na pytanie , czym jest synchronizacja wątków w Javie , mamy do dyspozycji dwa rodzaje synchronizacji: synchronizację wątków i synchronizację procesów.

Rozumiem, co każdy z nich oznacza.

Synchronizacja wątków: gdy wiele wątków próbuje uzyskać dostęp do zasobu udostępnionego, musimy upewnić się, że zasób jest używany tylko przez jeden wątek na raz. Synchronizacja wątków to proces zezwalania tylko jednemu wątkowi na korzystanie z udostępnionego zasobu, gdy wiele wątków próbuje jednocześnie korzystać z zasobu.

Synchronizacja procesów: Odnosi się do równoczesnego wykonywania wielu procesów w celu osiągnięcia stanu, w którym procesy zobowiązują się do odpowiedniej kolejności wykonywania. Synchronizacja procesów jest wymagana, gdy dwa lub więcej procesów współpracuje, a wykonanie jednego ma wpływ na drugi. W ten sposób synchronizacja procesów eliminuje możliwość niedokładnych wyników i gwarantuje prawidłową kolejność wykonania.

Metody synchronizacji w Javie

Ogólnie rzecz biorąc, w Javie istnieją cztery metody synchronizacji:

  • Zsynchronizowane metody statyczne
  • Zsynchronizowane metody instancji
  • Zsynchronizowany blok w metodach statycznych
  • Zsynchronizowany blok wewnątrz metod instancji

Przyjrzyjmy się bardziej szczegółowo każdej metodzie synchronizacji Javy.

Zsynchronizowane metody statyczne

Tutaj używamy słowa kluczowego synchronizowanego do oznaczenia metod statycznych w Javie. Oto przykład zsynchronizowanej metody statycznej Java:

publiczny statyczny MyStaticCounter {

prywatny statyczny int liczba = 0;

public statyczna synchronizacja void increment (wartość int) {

liczba += wartość;

}

}

Zsynchronizowane metody instancji

W przypadku korzystania z synchronizowanego bloku z metodami instancji, każdy obiekt ma swoją zsynchronizowaną metodę. Każdy obiekt może mieć tylko jeden wątek, który może być wykonywany wewnątrz metody. Jeśli istnieje wiele obiektów, pojedynczy wątek może zostać wykonany dla każdego obiektu wewnątrz bloku.

klasa publiczna Mój licznik {

liczba prywatnych int = 0;

public synchronizowane void increment (wartość int) {

to.liczba += wartość;

}

publiczne zsynchronizowane zmniejszanie wartości pustki (wartość int) {

this.count -= wartość;

}

}

Zsynchronizowany blok w metodach statycznych

Poniżej znajduje się przykład, w którym używamy zsynchronizowanego bloku wewnątrz metody statycznej:

klasa publiczna MojaKlasa {

public static void print(String message) {

zsynchronizowane(MojaKlasa.klasa) {

log.writeln(wiadomość);

}

}

}

Zsynchronizowany blok wewnątrz metod instancji

Zamiast synchronizować całą metodę, możemy zastosować synchronizację na konkretnym bloku w ramach metody. Poniżej znajduje się przykład zsynchronizowanego bloku kodu w metodzie niezsynchronizowanej:

public void increment (wartość int) {

zsynchronizowane (to) {

to.liczba += wartość;

}

}

Potrzeba synchronizacji w Javie

Teraz, gdy wiesz, czym jest synchronizacja w Javie , możesz się zastanawiać, dlaczego w ogóle jej używamy.

Zsynchronizowane słowo kluczowe Java udostępnia funkcje niezbędne do programowania współbieżnego. Oto jak pomaga synchronizacja w Javie:

  • Synchronizacja Java zapewnia funkcję blokowania, która eliminuje wszelkie sytuacje wyścigu między wątkami i zapewnia wzajemnie wykluczający się dostęp do współużytkowanego zasobu.
  • Zsynchronizowane blokowanie Java zapewnia zarówno funkcje blokowania, jak i odblokowywania. Tak więc wątek musi uzyskać blokadę przed wprowadzeniem zsynchronizowanej metody lub bloku.
  • Słowo kluczowe synchronizowane zapobiega zmianie kolejności instrukcji programu przez kompilator.

Wniosek

Podsumowując, synchronizacja w Javie gwarantuje, że tylko jeden wątek może jednocześnie uzyskać dostęp do współdzielonego zasobu. Możemy zsynchronizować blok lub metodę za pomocą słowa kluczowego Java synced. Gdy wątek chce dostać się do zsynchronizowanego bloku, musi nabyć blokadę, a po wyjściu z bloku wątek zwalnia blokadę. Możemy użyć słowa kluczowego synchronizowanego zarówno z metodami, jak i wewnątrz bloku metody.

Chcesz nauczyć się podstawowych pojęć w Javie? UpGrad Executive Post Graduate Program in Software Development - Specialization in Full Stack Development to internetowy 7-tygodniowy program dla początkujących, którzy chcą odkrywać kariery w tworzeniu oprogramowania. Weź udział w zajęciach na żywo i interaktywnych, sesjach treningowych i ponad 35 godzinach treści dostarczanych przez liderów branży, aby zdobyć certyfikat ukończenia od upGrad.

Zarejestruj się już dziś, aby skorzystać z wyjątkowych korzyści upGrad w postaci całodobowego wsparcia dla studentów i nawiązywania kontaktów w branży!

Dlaczego używamy zsynchronizowanego w Javie?

Słowo kluczowe synchronizowane w języku Java zapewnia, że ​​tylko jeden wątek może jednocześnie uzyskać dostęp do zasobów współużytkowanych. Jest to przydatne, gdy wielowątkowe programy Java próbują uzyskać dostęp do tego samego zasobu i generują niedokładne wyniki.

Jak zaimplementowana jest synchronizacja w Javie?

Java implementuje synchronizację wykorzystując koncepcję monitorów, w których tylko jeden wątek posiada monitor w danym momencie. Gdy wątek uzyskuje blokadę, uzyskuje dostęp do monitora, a wszystkie inne wątki próbujące dostać się do zablokowanego monitora pozostają zablokowane, dopóki pierwszy wątek nie opuści monitora.

Czym jest impas w Javie?

Zakleszczenie Javy występuje, gdy wątek czeka na blokadę obiektu, ale inny wątek ją przejmuje, a drugi wątek czeka na blokadę obiektu uzyskaną przez pierwszy. W związku z tym oba wątki czekają na siebie na zwolnienie blokady, co powoduje zakleszczenie.