Synckronizacija u Java
ล to je Synckronizacija u Java?
In Java, sinkronizacija se odnosi na moguฤnost kontrole pristupa viลกe niti bilo kojem dijeljenom resursu. To je idealna opcija kada samo jednoj niti ลพelimo dopustiti pristup dijeljenom resursu.
Ovaj pristup izvrลกenja obiฤno se naziva `asinkrono` programiranje. Na ovim procesorima takoฤer postoje niti, koje su lagani procesi koji mogu izvrลกavati instrukcije istovremeno.
Vrste Synchroniziranje
Postoje dvije vrste metoda sinkronizacije Java:
1) Sinkronizacija procesa
2) Sinkronizacija niti.
Prouฤimo Thread i Sinkronizacija procesa detaljno.
Sinkronizacija procesa: Upravlja sinkronizacijom izmeฤu programa. Na primjer, programi poput `Microsoft Word` i `Acrobat reader` pokreฤu se kao pojedinaฤni procesi.
Sinkronizacija niti: Istodobno izvrลกavanje kritiฤnog resursa od strane dvije ili viลกe niti naziva se niti Synchroniziranje. Moลพete se dodatno grupirati u meฤusobno iskljuฤivu komunikaciju i komunikaciju izmeฤu niti.
ล to je Lock in Java?
Zakljuฤati u Java izgraฤen je oko unutarnjeg entiteta poznatog kao monitor ili brava. Svi objekti imaju povezanu bravu. Dakle, nit koja treba konzistentan pristup poljima objekta mora steฤi zakljuฤavanje objekta prije nego ลกto im pristupi, i otpuลกta zakljuฤavanje kada je posao obavljen. Ovo osigurava da samo jedna nit istovremeno pristupa dijeljenim podacima.
Viลกenitni program sa sinkronizacijom
Viลกenitni program je metoda ili blok zaลกtiฤen od smetnji drugih niti koje dijele isti resurs naznaฤen pomoฤu kljuฤne rijeฤi `sinkronizirano`.
Koriลกtenje sinkronizirane metode
Svaka metoda koja je deklarirana kao sinkronizirana poznata je kao sinkronizirana metoda. Takoฤer se koristi za zakljuฤavanje objekta za bilo koji zajedniฤki resurs. Dakle, kada nit pozove sinkroniziranu metodu. Automatski preuzima bravu za taj objekt i otpuลกta ga kada zavrลกi svoj zadatak.
Biljeลกka: Sinkronizirana kljuฤna rijeฤ ne moลพe raditi s klasama i varijablama. Uz kljuฤnu rijeฤ mogu se koristiti samo metode i blokovi.
Zaลกto koristiti Synckronizirana metoda?
- Koristi se za zakljuฤavanje objekta za bilo koje zajedniฤke resurse.
- Objekt dobiva zakljuฤavanje kad god se pozove sinkronizirana metoda.
- Brava se ne otpuลกta sve dok nit ne zavrลกi svoju funkciju
Sintaksa:
Acess_modifiers synchronized return_type method_name (Method_Parameters) {
}
class MathService {
synchronized void getSumOfArray(int[] numbers) {
int sum = 0;
for (int number : numbers) {
System.out.println(Thread.currentThread()
.getName()
+ " adds "
+ sum + " to "
+ number + " to get -> "
+ (sum += number));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Synchronization {
public static void main(String[] args) {
MathService mathService = new MathService();
Thread threadOne = new Thread(() ->
mathService.getSumOfArray(new int[]{10, 11, 12}));
Thread threadTwo = new Thread(() ->
mathService.getSumOfArray(new int[]{20, 21, 22}));
threadOne.start();
threadTwo.start();
}
}
Objaลกnjenje Code:
Pokrenite ovaj primjer i promatrajte da nit `0` prvo dobiva zakljuฤavanje objekta `mathService` i koristi to zakljuฤavanje iskljuฤivo dok ne dovrลกi izvoฤenje. Niti "0" i "1" nisu isprepleteni u ovom kodu. Izlaz je kao ลกto je prikazano u nastavku.
Izlaz:
Thread-0 adds 0 to 10 to get -> 10 Thread-0 adds 10 to 11 to get -> 21 Thread-0 adds 21 to 12 to get -> 33 Thread-1 adds 0 to 20 to get -> 20 Thread-1 adds 20 to 21 to get -> 41 Thread-1 adds 41 to 22 to get -> 63
Koriลกtenje sinkroniziranog bloka
Pretpostavimo da ne ลพelite sinkronizirati cijelu metodu. Umjesto toga, ลพelite sinkronizirati nekoliko redaka koda. U to vrijeme, Synchronizirani blok pomogao sinkronizirati taj odabrani Java kodirati. Synczakljuฤavanjima kroniziranih metoda pristupa se na metodi, dok se zakljuฤavanjima sinkroniziranih blokova pristupa na objektu.
class MathService {
void getSumOfArray(int[] numbers) {
synchronized (this){
int sum = 0;
for (int number : numbers) {
System.out.println(Thread.currentThread()
.getName()
+ " adds "
+ sum + " to "
+ number + " to get -> "
+ (sum += number));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
public class Synchronization {
public static void main(String[] args) {
MathService mathService = new MathService();
Thread threadOne = new Thread(() ->
mathService.getSumOfArray(new int[]{10, 11, 12}));
Thread threadTwo = new Thread(() ->
mathService.getSumOfArray(new int[]{20, 21, 22}));
threadOne.start();
threadTwo.start();
}
}
Code Objaลกnjenje:
Nakon pokretanja ovog koda primijetit ฤete da radi bez ikakvih smetnji. U sinkroniziranoj metodi zakljuฤavanje primjenjuje metoda, ali u sinkroniziranom bloku zakljuฤavanje primjenjuje objekt. Provjerite je li izlaz kao ลกto je prikazano u nastavku.
Izlaz:
Thread-0 adds 0 to 10 to get -> 10 Thread-0 adds 10 to 11 to get -> 21 Thread-0 adds 21 to 12 to get -> 33 Thread-1 adds 0 to 20 to get -> 20 Thread-1 adds 20 to 21 to get -> 41 Thread-1 adds 41 to 22 to get -> 63
Objaลกnjenje koda:
Kada pokrenete ovaj kod, primijetit ฤete da radi bez smetnji, ลกto smo i oฤekivali. U sinkroniziranoj metodi zakljuฤavanje primjenjuje metoda, ali u metodi sinkroniziranog bloka zakljuฤavanje primjenjuje objekt.
Koriลกtenje statiฤke sinkronizacije
In Java sinkronizacija, ako postoji viลกe od jednog objekta, dvije niti mogu dobiti zakljuฤavanja i uฤi u sinkronizirani blok ili blok, s posebnim zakljuฤavanjem za svaki objekt. Kako bi se to izbjeglo, moลพe se koristiti statiฤka sinkronizacija. Synckronizirane kljuฤne rijeฤi koristit ฤe se prije statiฤkih metoda.
Biljeลกka: U statiฤkoj sinkronizaciji pristup zakljuฤavanju je na klasi, a ne na objektu i metodi.
Code demonstrirati problem zakljuฤavanja viลกe objekata
class MathService {
synchronized void getSumOfArray(int[] numbers) {
int sum = 0;
for (int number : numbers) {
System.out.println(Thread.currentThread()
.getName()
+ " adds "
+ sum + " to "
+ number + " to get -> "
+ (sum += number));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Synchronization {
public static void main(String[] args) {
MathService mathService = new MathService();
MathService mathService1 = new MathService();
Thread threadOne = new Thread(() ->
mathService.getSumOfArray(new int[]{10, 11, 12}));
Thread threadTwo = new Thread(() ->
mathService.getSumOfArray(new int[]{20, 21, 22}));
Thread threadThree = new Thread(() ->
mathService1.getSumOfArray(new int[]{10, 11, 12}));
Thread threadFour = new Thread(() ->
mathService1.getSumOfArray(new int[]{20, 21, 22}));
threadOne.start();
threadTwo.start();
threadThree.start();
threadFour.start();
}
}
Objaลกnjenje koda:
Kada stvorimo drugu instancu `MathService`, uvodimo smetnje u niti jer ฤe biti isprepletene s dva objekta. Imajte na umu da su nit `0` i nit `2` isprepletene s dva objekta, dok su nit `1` i `3` isprepletene s dva objekta.
Izlaz:
Thread-0 adds 0 to 10 to get -> 10 Thread-2 adds 0 to 10 to get -> 10 Thread-0 adds 10 to 11 to get -> 21 Thread-2 adds 10 to 11 to get -> 21 Thread-0 adds 21 to 12 to get -> 33 Thread-2 adds 21 to 12 to get -> 33 Thread-1 adds 0 to 20 to get -> 20 Thread-3 adds 0 to 20 to get -> 20 Thread-1 adds 20 to 21 to get -> 41 Thread-3 adds 20 to 21 to get -> 41 Thread-1 adds 41 to 22 to get -> 63 Thread-3 adds 41 to 22 to get -> 63
Isti kod koriลกtenjem sinkronizirane statiฤke metode
class MathService {
synchronized static void getSumOfArray(int[] numbers) {
int sum = 0;
for (int number : numbers) {
System.out.println(Thread.currentThread()
.getName()
+ " adds "
+ sum + " to "
+ number + " to get -> "
+ (sum += number));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Synchronization {
public static void main(String[] args) {
MathService mathService = new MathService();
MathService mathService1 = new MathService();
Thread threadOne = new Thread(() ->
mathService.getSumOfArray(new int[]{10, 11, 12}));
Thread threadTwo = new Thread(() ->
mathService.getSumOfArray(new int[]{20, 21, 22}));
Thread threadThree = new Thread(() ->
mathService1.getSumOfArray(new int[]{10, 11, 12}));
Thread threadFour = new Thread(() ->
mathService1.getSumOfArray(new int[]{20, 21, 22}));
threadOne.start();
threadTwo.start();
threadThree.start();
threadFour.start();
}
}
Pokrenite gornji kod i imajte na umu da smo sada eliminirali smetnje niti. Izlaz koda prikazan je u nastavku.
Izlaz:
Thread-0 adds 0 to 10 to get -> 10 Thread-0 adds 10 to 11 to get -> 21 Thread-0 adds 21 to 12 to get -> 33 Thread-3 adds 0 to 20 to get -> 20 Thread-3 adds 20 to 21 to get -> 41 Thread-3 adds 41 to 22 to get -> 63 Thread-2 adds 0 to 10 to get -> 10 Thread-2 adds 10 to 11 to get -> 21 Thread-2 adds 21 to 12 to get -> 33 Thread-1 adds 0 to 20 to get -> 20 Thread-1 adds 20 to 21 to get -> 41 Thread-1 adds 41 to 22 to get -> 63
Prednosti koriลกtenja sinkronizacije
Evo prednosti rada s istodobnim aplikacijama:
- Glavni cilj sinkronizacije u Java je sprijeฤiti nedosljedne podatke sprjeฤavanjem interferencije niti.
- Sinkronizirana kljuฤna rijeฤ u Java pruลพa zakljuฤavanje, koje osigurava meฤusobno iskljuฤiv pristup dijeljenom resursu i sprjeฤava utrku podataka.
- Takoฤer sprjeฤava promjenu redoslijeda izraza koda od strane kompajler, ลกto moลพe uzrokovati suptilan istovremeni problem ako ne koristimo promjenjive ili sinkronizirane kljuฤne rijeฤi.
- Synchronizirana kljuฤna rijeฤ ฤita podatke iz glavne memorije nego iz predmemorije i kada otkljuฤa.
- Takoฤer ispire operacije pisanja iz glavne memorije, eliminirajuฤi greลกke nedosljednosti memorije.
Nedostaci Syncmehanizam kronizacije
Synckronizacija Mehanizmi imaju slabu izvedbu.
Na primjer
- Pretpostavimo da postoji pet procesa, A1, A2, A3, A4 i A5.
- Oni ฤekaju da zajedniฤki resursi pristupe jednoj po jednoj niti.
- Svi procesi ostaju na ฤekanju, tako da posljednji u redu ฤekanja moraju ฤekati dok se svi ostali procesi ne zavrลกe.
Rezime
- Synchronizacija se odnosi na moguฤnost kontrole pristupa viลกe niti bilo kojem zajedniฤkom resursu.
- Java ima dvije vrste metoda sinkronizacije: 1) Sinkronizacija procesa i 2) Sinkronizacija niti.
- Zakljuฤati u Java izgraฤen je oko unutarnjeg entiteta poznatog kao monitor ili brava.
- Viลกenitni program je metoda ili blok zaลกtiฤen od smetnji drugih niti koje dijele isti resurs oznaฤen pomoฤu kljuฤne rijeฤi `sinkronizirano`.
- Svaka metoda koja je deklarirana kao sinkronizirana poznata je kao sinkronizirana metoda.
- In Java, zakljuฤavanjima sinkroniziranih metoda pristupa se na metodi, dok se zakljuฤavanjima sinkroniziranih blokova pristupa na objektu.
- U statiฤkoj sinkronizaciji pristup zakljuฤavanju je na klasi, a ne na objektu i metodi.
- Glavni cilj sinkronizacije u Java je sprijeฤiti nedosljedne podatke sprjeฤavanjem interferencije niti.
- Najveฤi nedostatak ove metode je ลกto se svi procesi drลพe na ฤekanju, tako da posljednji u redu ฤekanja moraju ฤekati dok se svi ostali procesi ne zavrลกe.
