Sinkronizacija u Javi: Što, kako i zašto?



Ovaj članak o Sinkronizaciji u Javi pomoći će vam da saznate više o sinkronizaciji programa s više niti.

Programi s više niti mogu redovito dolaziti do okolnosti kada su višestruki pokušati doći do istog resursa koji daje lažne i zapanjujuće ishode. To se može riješiti korištenjem sinkronizacije u Javi. Samo jedna određena nit može doći do resursa u određenu svrhu. Ovaj će vam članak pomoći da se upoznate sa strategijom sinkronizacije.

Raspravljat ću o temama ovim redoslijedom:





Započnimo!

duljina javascripta niza

Zašto koristiti sinkronizaciju u Javi?



Ako započnete s najmanje dvije niti unutar programa, možda postoji šansa kada više niti pokuša doći do istog resursa. To čak može stvoriti neočekivani ishod zbog problema s istodobnošću.

Sintaksa :

sinkronizirano (objectidentifier) ​​{// Pristup dijeljenim varijablama i drugim dijeljenim resursima}

Na primjer, pokušaj pisanja u ekvivalentnoj datoteci. To može oštetiti podatke jer jedna od niti može nadjačati podatke ili kada nit otvaraistom datotekom u isto vrijeme, možda druga nit zatvara istu datoteku.Potrebno je sinkronizirati djelovanje više niti. To se može provesti pomoću koncepta tzv M oniori .



  • Svaki je povezan s monitorom, koji nit može zaključati ili otključati.
  • Samo jedna nit odjednom može držati bravu na monitoru.
  • Java Programski jezik pruža vrlo praktičan način stvaranja niti i sinkronizacije njihovih zadataka pomoću Sinkronizirano blokovi.
  • Također zadržava zajedničke resurse unutar ovog određenog bloka.

Sinkronizirani blokovi u Javi označeni su znakom Sinkronizirano ključna riječ. Ovaj blok u Javi sinkroniziran je na nekom objektu.Svi blokovi koji su sinkronizirani na istom objektu mogu istodobno izvršavati samo jednu nit. Sve ostale niti koje pokušavaju ući u sinkronizirani blok blokirane su sve dok nit unutar sinkroniziranog bloka ne izađe iz bloka.

Vrste sinkronizacije

U osnovi postoje dvije vrste sinkronizacije. Oni su:

  1. Sinkronizacija procesa: Istovremeno izvršavanje više niti ili procesa za postizanje stanja takvog da se oni obvezuju na određeni slijed radnji.
  2. Sinkronizacija niti: U trenucima kada više nitipokušava pristupiti zajedničkom resursu, morate osigurati da će resurs koristiti samo jedna nit naVrijeme.

Ne ulazimo u detalje ovih vrsta i pokušajmo razumjeti što su brave .

Brave u Javi

Kao što sam već spomenuo, sinkronizacija se temelji na unutarnjem entitetu poznatom kao zaključati ili monitor . Uz svaki je objekt povezana brava. Dakle, nit koja treba dosljedan pristup poljima objekta mora steći bravu objekta prije pristupanja njima, a zatim otpustiti bravu kad je posao završen.

Iz Jave 5, paket java.util.concurrent.locks sadrži mnoge implementacije zaključavanja.

Ovako izgleda brava:

zaključavanje javne klase {private boolean isLocked = lažno javno sinkronizirano void lock () baca InterruptedException {while (isLocked) {wait ()} isLocked = true} javno sinkronizirano void unlock () {isLocked = false notify ()}}

Metoda lock () zaključava instancu Lock tako da su sve niti koje pozivaju lock () blokirane dok se ne izvrši unlock ().

Višestruki navoj bez sinkronizacije

Evo jednostavnog primjera koji ispisuje vrijednost brojača u nizu i svaki put kad ga pokrenemo, on daje drugačiji rezultat na temelju dostupnosti CPU-a u niti. Pogledaj ovo!

klasa Multithread {public void printCount () {try {for (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Rezultati gore navedenog programa u ovom:

Izlaz- Sinkronizacija u Javi- Edureka

Višestruki navoj sa sinkronizacijom

Ovo je isti primjer kao gore, ali ispisuje vrijednost brojača u nizu. Svaki put kad ga pokrenemo, on daje isti rezultat.

klasa Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Izuzetak e) {System. out.println ('Nit prekinut.')}}} klasa Nit se proteže Multithread {private Thread t private String threadName Multithread MT Thread (naziv niza, Multithread mt) {threadName = name MT = mt} public void run () {sinkronizirano ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starting' + threadName) if (t == null) {t = new Thread (this, threadName) t.start ()}}} javna klasa TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Navoj T1 = nova nit (' Nit - 2 ', MT) T.start () T1.start () // pričekajte da teme završe pokušati {T.join () T1.join ()} catch (Iznimka e) {System.out.println ('Prekinuta')}}}

Izlaz je prikazan u nastavku:

Sinkronizirana ključna riječ

sinkronizirana ključna riječ označava blok ili metodu kritičnim odjeljkom. Kritični je odjeljak u kojem se istodobno izvršava samo jedna nit, a nit drži bravu za sinkronizirani odjeljak. Ovaj sinkronizirano ključna riječ pomaže u pisanju istovremeno dijelovi bilo koje aplikacije. Također štiti zajedničke resurse unutar bloka.

Sinkronizirana ključna riječ može se koristiti sa:

Razgovarajmo o bloku koda.

Sinkronizirana ključna riječ: blok koda

Sintaksa

Opća sintaksa za pisanje sinkroniziranog bloka je:

sinkronizirano (lockObject) {// sinkronizirane izjave}

Kada nit želi izvršiti sinkronizirane izraze unutar bloka, mora dobiti zaključavanje na monitoru lockObject-a. Samo jedna nit može istodobno dobiti monitor zaključanog objekta. Dakle, sve ostale niti moraju pričekati dok trenutačno izvršavajuća nit stekne bravu i završi svoje izvršavanje.
Ovim putem, sinkronizirano ključna riječ jamči da će samo jedna nit izvršavati sinkronizirane naredbe bloka istodobno i na taj način sprečava više niti da oštete dijeljene podatke koji su prisutni unutar bloka.

Bilješka :

  • Ako se nit postavi u stanje mirovanja (pomoću spavati() metoda) tada ne otpušta bravu. Tijekom ovog vremena mirovanja niti jedna nit neće izvršavati izraze sinkroniziranih blokova.
  • Java sinkronizacija će baciti NullPointerException ako se objekt zaključavanja koristi u ' sinkronizirano (zaključavanje) 'Je ništavno.

Sada, razgovarajmo o metodi.

što je čar u javi

Sinkronizirana ključna riječ: Metoda

Sintaksa

Opća sintaksa za pisanje a sinkronizirana metoda je:

sinkronizirana metoda (parametri) {// sinkronizirani kod}

Ovdje lockObject je samo referenca na objekt čija je brava povezana s monitorom koji predstavlja sinkronizirane izraze.

Slično sinkroniziranom bloku, nit mora sinkroniziranom metodom dobiti zaključavanje na povezanom objektu monitora. U slučaju sinkronizirane metode, objekt zaključavanja je:

  • Objekt. .Razreda - ako je zadana metoda statički .
  • 'Ovaj' objekt - ako je metoda nestatičan . 'Ovo' je referenca na trenutni objekt u kojem se poziva sinkronizirana metoda.

Java sinkronizirana ključna riječ je uvučen u prirodi. To znači da ako sinkronizirana metoda pozove drugu sinkroniziranu metodu koja zahtijeva isto zaključavanje, tada trenutna nit koja drži bravu može ući u tu metodu bez dobivanja brave.

Prijeđimo na posljednju temu ovog članka i ukažemo na glavne razlike između sinkronizirane ključne riječi i sinkronizacijskog bloka.

Razlika između sinkronizirane ključne riječi i sinkroniziranog bloka

  • Kada koristite sinkroniziranu ključnu riječ s metoda , dobiva bravu u objektu za cijelu metodu. To znači da nijedna druga nit ne može koristiti nijednu sinkroniziranu metodu dok trenutna nit koja se poziva ne završi svoje izvršavanje.
  • Sinkronizirano blok dobiva zaključavanje u objektu samo između zagrada nakon što je navedena sinkronizirana ključna riječ. To znači da niti jedna druga nit ne može zaključati već zaključani objekt dok blok ne izađe. Ali druge niti moći će pristupiti ostatku koda koji je prisutan u metodi.

To nas dovodi do kraja ovog članka gdje smo raspravljali o tome kako točno funkcionira Sinkronizacija u Javi. Nadam se da vam je jasno sve što je s vama podijeljeno u ovom vodiču.

Pogledajte Edureka, pouzdana tvrtka za internetsko učenje s mrežom od više od 250 000 zadovoljnih učenika raširenih širom svijeta. Ovdje smo da vam pomognemo u svakom koraku na putovanju, jer osim što postajete pitanja za ovaj intervju za javu, donosimo kurikulum koji je dizajniran za studente i profesionalce koji žele biti programer za Javu.

Imate pitanje za nas? Molimo navedite ga u odjeljku za komentare ovog „Sinkronizacija u Javi ' članka i javit ćemo vam se u najkraćem mogućem roku.