Kompleksowy przewodnik po synchronizacji w Javie
Opublikowany: 2022-05-20Zanim wyjaśnimy synchronizację w Javie , musimy pokrótce przyjrzeć się koncepcji wielowątkowości. Wielowątkowość 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.
W tym przewodniku na temat tego, czym jest synchronizacja w Javie , szczegółowo omówimy koncepcję synchronizacji na przykładach.
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.
Składnia do pisania zsynchronizowanego bloku
Ogólna składnia pisania zsynchronizowanego bloku w Javie jest następująca:
zsynchronizowany( lockObject )
{
// zsynchronizowane instrukcje
}
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.
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.
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ę.
Zsynchronizowana metoda Java
Celem zsynchronizowanej metody Java jest zablokowanie obiektów dla współużytkowanych 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ój wątek1 (tabela t){
to.t=t;
}
publiczne void run(){
t.printTable(5);
}
}
class MyThread2 rozszerza Thread{
Tablet;
Mój wą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();
}
}
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ój wą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.
Poznaj nasze popularne kursy inżynierii oprogramowania
SL. Nie | Programy rozwoju oprogramowania | |
1 | Master of Science in Computer Science z LJMU i IIITB | Program certyfikacji cyberbezpieczeństwa Caltech CTME |
2 | Pełny Bootcamp rozwoju stosu | Program PG w Blockchain |
3 | Executive Post Graduate Programme in Software Development - specjalizacja w DevOps | Wyświetl wszystkie kursy inżynierii oprogramowania |
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 zmniejszenie 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 mieć dostęp do współdzielonego zasobu na raz. 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.
Zastanawiasz się, gdzie nauczyć się Javy?
UpGrad's Job-linked PG Certification w inżynierii oprogramowania jest tym, czego szukasz!
Specjalnie zaprojektowany dla świeżo upieczonych absolwentów i ostatnich lat, certyfikacja PG związana z pracą w inżynierii oprogramowania jest idealna dla tych, którzy chcą nauczyć się programować i zająć stanowiska w zakresie oprogramowania na poziomie podstawowym. Ten 5-miesięczny program online nauczy najlepszych umiejętności związanych z oprogramowaniem, takich jak Java, JavaScript, HTML5, DSA, AWS, MERN i nie tylko!
P: Dlaczego używamy zsynchronizowanego w Javie?
O: Słowo kluczowe synchronizowane w Javie zapewnia, że tylko jeden wątek może jednocześnie uzyskać dostęp do współużytkowanych zasobów. Jest to przydatne, gdy wielowątkowe programy Java próbują uzyskać dostęp do tego samego zasobu i generują niedokładne wyniki.
P: Jak zaimplementowana jest synchronizacja w Javie?
O: Java implementuje synchronizację przy użyciu koncepcji monitorów, w których tylko jeden wątek posiada monitor w danym czasie. 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.
P: Czym jest impas w Javie?
O: 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.