java synchronized what is thread synchronization java
Ovaj vodič objašnjava sinkronizaciju niti u Javi zajedno sa srodnim konceptima kao što su Java Lock, Race Condition, Mutex, Java Volatile & Deadlock u Javi:
U okruženju s više niti, u kojem je uključeno više niti, sigurno će doći do sukoba kada više od jedne niti istodobno pokušava dobiti isti resurs. Ovi sukobi rezultiraju 'uvjetom utrke' i tako program daje neočekivane rezultate.
Na primjer, jednu datoteku ažuriraju dvije niti. Ako je jedna nit T1 u procesu ažuriranja ove datoteke, recite neku varijablu. Sada, dok je ovo ažuriranje od strane T1 još uvijek u tijeku, recimo da druga nit T2 također ažurira istu varijablu. Na taj će način varijabla dati pogrešne rezultate.
=> Ovdje pogledajte kompletnu seriju Java treninga.
Kada je uključeno više niti, trebali bismo upravljati tim nitima na takav način da resursu može pristupiti pojedinačna nit odjednom. U gornjem primjeru, datotekom kojoj pristupaju obje niti treba upravljati na takav način da T2 ne može pristupiti datoteci dok T1 ne pristupi.
To se radi na Javi koristeći “ Sinkronizacija niti '.
Što ćete naučiti:
- Sinkronizacija niti u Javi
- Višestruki navoj bez sinkronizacije
- Višestruki navoj sa sinkronizacijom
- Zaključak
Sinkronizacija niti u Javi
Kako je Java jezik s više niti, sinkronizacija niti ima veliku važnost u Javi jer se više niti paralelno izvršava u aplikaciji.
Koristimo ključne riječi 'Sinkronizirano' i “Hlapljiv” kako bi se postigla sinkronizacija u Javi
Sinkronizacija nam je potrebna kada je zajednički objekt ili resurs moguće mijenjati. Ako je resurs nepromjenjiv, tada će niti čitati resurs samo istodobno ili pojedinačno.
U ovom slučaju ne trebamo sinkronizirati resurs. U ovom slučaju JVM to osigurava Java sinkronizirani kôd izvršava jedna nit odjednom .
Većinu vremena istodobni pristup dijeljenim resursima na Javi može donijeti pogreške poput 'Neusklađenost memorije' i 'smetnje niti'. Da bismo izbjegli ove pogreške, moramo ići na sinkronizaciju zajedničkih resursa tako da se pristup tim resursima međusobno isključuje.
Koristimo koncept tzv Monitori za provedbu sinkronizacije. Monitoru istovremeno može pristupiti samo jedna nit. Kad nit dobije bravu, tada možemo reći da je nit ušla u monitor.
Kad se određenom niti pristupa monitoru, monitor se zaključava, a sve ostale niti koje pokušavaju ući u monitor suspendiraju se dok nit za pristup ne završi i ne otpusti bravu.
Ubuduće ćemo detaljno razgovarati o sinkronizaciji u Javi u ovom vodiču. Sada ćemo razgovarati o nekim osnovnim konceptima povezanim sa sinkronizacijom u Javi.
Stanje utrke u Javi
U višenitnom okruženju, kada više niti pokušava istovremeno pristupiti zajedničkom resursu za pisanje, tada se više niti utrkuju kako bi završile pristup resursu. To dovodi do 'uvjeta rase'.
Treba razmotriti da nema problema ako više niti pokušava pristupiti zajedničkom resursu samo za čitanje. Problem nastaje kada više niti istovremeno pristupa istom resursu.
Uvjeti trke nastaju zbog nedostatka odgovarajuće sinkronizacije niti u programu. Kada pravilno sinkroniziramo niti tako da će istodobno samo jedna nit pristupiti resursu, a uvjeti utrke prestaju postojati.
Pa kako ćemo otkriti uvjete utrke?
Najbolji način za otkrivanje stanja utrke je pregled koda. Kao programer, trebali bismo temeljito pregledati kôd kako bismo provjerili postoje li mogući uvjeti utrke.
Brave / monitori u Javi
Već smo spomenuli da za provedbu sinkronizacije koristimo monitore ili brave. Monitor ili zaključavanje je unutarnja cjelina i povezan je sa svim objektima. Dakle, kad god nit treba pristupiti objektu, prvo mora nabaviti bravu ili monitor svog objekta, raditi na objektu, a zatim otpustiti bravu.
Brave u Javi izgledat će kao što je prikazano dolje:
public class Lock { private boolean isLocked = false; public synchronized void lock() throws InterruptedException { while(isLocked) { wait(); } isLocked = true; } public synchronized void unlock(){ isLocked = false; notify(); } }
Kao što je gore prikazano, imamo metodu lock () koja zaključava instancu. Sve niti koje pozivaju metodu lock () bit će blokirane dok se skupovi metoda unblock () ne zaključaju zastavicom na false i obavijeste sve niti koje čekaju.
Neke upute o bravama:
- U Javi svaki objekt ima bravu ili monitor. Ovoj bravi može se pristupiti pomoću niti.
- Odjednom samo jedna nit može dobiti ovaj monitor ili zaključati.
- Java programski jezik pruža ključnu riječ Synchronized (Sinkronizirano) koja nam omogućuje sinkronizaciju niti izrađivanjem bloka ili metode kao Synchronized.
- Zajednički resursi kojima niti trebaju pristupiti čuvaju se pod ovim Sinkroniziranim blokom / metodom.
Muteksi u Javi
Već smo raspravljali da se u višenitnom okruženju mogu pojaviti uvjeti utrke kada više niti pokušava istovremeno pristupiti zajedničkim resursima, a uvjeti utrke rezultiraju neočekivanim rezultatima.
Dio programa koji pokušava pristupiti zajedničkom resursu naziva se 'Kritični odjeljak' . Da bi se izbjegla pojava uvjeta utrke, potrebno je sinkronizirati pristup kritičnom dijelu. Sinkroniziranjem ovog kritičnog odjeljka osiguravamo da odjednom samo jedna nit može pristupiti kritičnom odjeljku.
Najjednostavniji tip sinkronizatora je 'mutex'. Mutex osigurava da u bilo kojoj datoj instanci samo jedna nit može izvršiti kritični odjeljak.
Mutex je sličan konceptu monitora ili brava o kojem smo gore govorili. Ako nit treba pristupiti kritičnom odjeljku, tada mora steći mutex. Jednom kada se stekne mutex, nit će pristupiti kritičnom kodu odjeljka, a kada završi, oslobodit će mutex.
Ostale niti koje čekaju pristup kritičnom odjeljku u međuvremenu će biti blokirane. Čim ga nit koja drži mutex otpusti, druga nit će ući u kritični odjeljak.
najbolja besplatna aplikacija za preuzimanje glazbe za android
Postoji nekoliko načina na koje možemo implementirati mutex u Javi.
- Korištenje sinkronizirane ključne riječi
- Korištenje Semaphorea
- Korištenje ReentrantLock-a
U ovom uputstvu raspravit ćemo o prvom pristupu, tj. O sinkronizaciji. Druga dva pristupa - Semaphore i ReentrantLock bit će razmotreni u sljedećem vodiču u kojem ćemo razgovarati o istodobnom paketu Java.
Sinkronizirana ključna riječ
Java nudi ključnu riječ 'Sinkronizirano' koja se u programu može koristiti za označavanje kritičnog odjeljka. Kritični odjeljak može biti blok koda ili cjelovita metoda. Dakle, samo jedna nit može pristupiti kritičnom odjeljku označenom sinkroniziranom ključnom riječi.
Istovremene dijelove (dijelove koji se izvršavaju istovremeno) za aplikaciju možemo napisati pomoću sinkronizirane ključne riječi. Također se rješavamo uvjeta utrke tako što napravimo blok koda ili sinkroniziranu metodu.
Kad označimo blok ili metodu sinkroniziranim, štitimo zajedničke resurse unutar tih entiteta od istodobnog pristupa i time oštećenja.
Vrste sinkronizacije
Postoje dvije vrste sinkronizacije kako je objašnjeno u nastavku:
# 1) Sinkronizacija procesa
Sinkronizacija procesa uključuje istovremeno izvršavanje više procesa ili niti. U konačnici dosežu stanje u kojem se ti procesi ili niti obvezuju na određeni slijed radnji.
# 2) Sinkronizacija niti
U sinkronizaciji niti, više niti pokušava pristupiti zajedničkom prostoru. Niti se sinkroniziraju na takav način da zajedničkom prostoru istovremeno pristupa samo jedna nit.
Sinkronizacija procesa izvan je opsega ovog vodiča. Stoga ćemo ovdje raspravljati samo o sinkronizaciji niti.
U Javi sinkroniziranu ključnu riječ možemo koristiti sa:
- Blok koda
- Metoda
Gore navedeni tipovi međusobno se isključuju vrste sinkronizacije niti. Međusobno izuzeće sprječava međusobno ometanje niti koje pristupaju zajedničkim podacima.
privatni poslužitelji za world of warcraft
Druga vrsta sinkronizacije niti je 'InterThread komunikacija' koja se temelji na suradnji između niti. Komunikacija među nitima izvan je opsega ovog vodiča.
Prije nego što nastavimo sa sinkronizacijom blokova i metoda, implementirajmo Java program da demonstriramo ponašanje niti kada nema sinkronizacije.
Višestruki navoj bez sinkronizacije
Sljedeći Java program ima više niti koje nisu sinkronizirane.
class PrintCount { //method to print the thread counter public void printcounter() { try { for(int i = 5; i > 0; i--) { System.out.println('Counter ==> ' + i ); } } catch (Exception e) { System.out.println('Thread interrupted.'); } } } //thread class class ThreadCounter extends Thread { private Thread t; private String threadName; PrintCount PD; //class constructor for initialization ThreadCounter( String name, PrintCount pd) { threadName = name; PD = pd; } //run method for thread public void run() { PD.printcounter(); System.out.println('Thread ' + threadName + ' exiting.'); } //start method for thread public void start () { System.out.println('Starting ' + threadName ); if (t == null) { t = new Thread (this, threadName); t.start (); } } } public class Main { public static void main(String args()) { PrintCount PD = new PrintCount(); //create two instances of thread class ThreadCounter T1 = new ThreadCounter( 'ThreadCounter_1 ', PD ); ThreadCounter T2 = new ThreadCounter( 'ThreadCounter_2 ', PD ); //start both the threads T1.start(); T2.start(); // wait for threads to end try { T1.join(); T2.join(); } catch ( Exception e) { System.out.println('Interrupted'); } } }
Izlaz
Iz izlaza možemo vidjeti da je, budući da se niti nisu sinkronizirane, izlaz nedosljedan. Obje niti počinju, a zatim prikazuju brojač jednu za drugom. Obje niti izlaze na kraju.
Iz datog programa prva nit trebala je izaći nakon prikazivanja vrijednosti brojača, a zatim je druga nit trebala početi prikazivati vrijednosti brojača.
Idemo sada na sinkronizaciju i započnimo sa sinkronizacijom bloka koda.
Sinkronizirani blok koda
Sinkronizirani blok koristi se za sinkronizaciju bloka koda. Ovaj se blok obično sastoji od nekoliko redaka. Sinkronizirani blok koristi se kada ne želimo da se sinkronizira cijela metoda.
Na primjer, imamo metodu s recimo 75 redaka koda. Od toga samo 10 redaka koda treba istodobno izvršavati jedna nit. U ovom slučaju, ako cjelokupnu metodu učinimo sinkroniziranom, tada će to biti teret za sustav. U takvim situacijama koristimo sinkronizirane blokove.
Opseg sinkronizirane metode uvijek je manji od opsega sinkronizirane metode. Sinkronizirana metoda zaključava objekt zajedničkog resursa koji će koristiti više niti.
Općenita sintaksa sinkroniziranog bloka prikazana je dolje:
synchronized (lock_object){ //synchronized code statements }
Ovdje je 'lock_object' izraz reference objekta na kojem se treba dobiti zaključavanje. Dakle, kad god nit želi pristupiti sinkroniziranim izrazima unutar bloka radi izvršenja, tada mora steći zaključavanje na monitoru ‘lock_object’.
Kao što je već rečeno, sinkronizirana ključna riječ osigurava da samo jedna nit može stjecati bravu odjednom, a sve ostale niti moraju pričekati dok nit koja drži bravu ne završi i otpusti bravu.
Bilješka
- Baci se 'NullPointerException' ako je objekt lock_object null.
- Ako konac spava dok još uvijek drži bravu, tada se bravica ne oslobađa. Ostale niti tijekom ovog vremena mirovanja neće moći pristupiti zajedničkom objektu.
Sada ćemo predstaviti gornji primjer koji je već implementiran s malim izmjenama. U ranijem programu nismo sinkronizirali kôd. Sada ćemo upotrijebiti sinkronizirani blok i usporediti izlaz.
Višestruki navoj sa sinkronizacijom
U donjem programu Java koristimo sinkronizirani blok. U metodi izvođenja sinkroniziramo kod linija koje ispisuju brojač za svaku nit.
class PrintCount { //print thread counter public void printCounter() { try { for(int i = 5; i > 0; i--) { System.out.println('Counter ==> ' + i ); } } catch (Exception e) { System.out.println('Thread interrupted.'); } } } //thread class class ThreadCounter extends Thread { private Thread t; private String threadName; PrintCount PD; //class constructor for initialization ThreadCounter( String name, PrintCount pd) { threadName = name; PD = pd; } //run () method for thread with synchronized block public void run() { synchronized(PD) { PD.printCounter(); } System.out.println('Thread ' + threadName + ' exiting.'); } //start () method for thread public void start () { System.out.println('Starting ' + threadName ); if (t == null) { t = new Thread (this, threadName); t.start (); } } } public class Main { public static void main(String args()) { PrintCount PD = new PrintCount(); //create thread instances ThreadCounter T1 = new ThreadCounter( 'Thread_1 ', PD ); ThreadCounter T2 = new ThreadCounter( 'Thread_2 ', PD ); //start both the threads T1.start(); T2.start(); // wait for threads to end try { T1.join(); T2.join(); } catch ( Exception e) { System.out.println('Interrupted'); } } }
Izlaz
Sada je izlaz ovog programa pomoću sinkroniziranog bloka prilično dosljedan. Kao što se očekivalo, obje niti počinju se izvršavati. Prva nit završila je prikazivanjem vrijednosti brojača i izlaza. Tada druga nit prikazuje vrijednosti brojača i izlazi.
Sinkronizirana metoda
Razmotrimo sinkroniziranu metodu u ovom odjeljku. Ranije smo vidjeli da mali blok koji se sastoji od manje redaka koda možemo proglasiti sinkroniziranim blokom. Ako želimo da se cijela funkcija sinkronizira, tada metodu možemo proglasiti sinkroniziranom.
Kada se metoda sinkronizira, tada će samo jedna nit istovremeno moći uputiti poziv metode.
Opća sintaksa za pisanje sinkronizirane metode je:
synchronized method_name (parameters){ //synchronized code }
Baš kao i sinkronizirani blok, u slučaju sinkronizirane metode, trebamo lock_object koji će koristiti niti koje pristupaju sinkroniziranoj metodi.
Za sinkroniziranu metodu objekt zaključavanja može biti jedno od sljedećeg:
- Ako je sinkronizirana metoda statična, objekt zaključavanja daje objekt '.class'.
- Za ne-statičku metodu, objekt zaključavanja daje trenutni objekt, tj. 'Ovaj' objekt.
Osobita je značajka sinkronizirane ključne riječi da se ponovno uključuje. To znači da sinkronizirana metoda može pozvati drugu sinkroniziranu metodu s istim zaključavanjem. Dakle, nit koji drži bravu može pristupiti drugoj sinkroniziranoj metodi bez potrebe za dobivanjem druge brave.
Sinkronizirana metoda prikazana je primjerom u nastavku.
class NumberClass { //synchronized method to print squares of numbers synchronized void printSquares(int n) throws InterruptedException { //iterate from 1 to given number and print the squares at each iteration for (int i = 1; i <= n; i++) { System.out.println(Thread.currentThread().getName() + ' :: '+ i*i); Thread.sleep(500); } } } public class Main { public static void main(String args()) { final NumberClass number = new NumberClass(); //create thread Runnable thread = new Runnable() { public void run() { try { number.printSquares(3); } catch (InterruptedException e) { e.printStackTrace(); } } }; //start thread instance new Thread(thread, 'Thread One').start(); new Thread(thread, 'Thread Two').start(); } }
Izlaz
U gore navedenom programu koristili smo sinkroniziranu metodu za ispis kvadrata broja. Gornja granica broja predaje se metodi kao argument. Zatim se počevši od 1, kvadrati svakog broja ispisuju dok se ne dosegne gornja granica.
U glavnoj funkciji stvara se instanca niti. Svakoj instanci niti prosljeđuje se broj za ispis kvadrata.
Kao što je gore spomenuto, kada je metoda koja se sinkronizira statična, tada je objekt klase uključen u klasu, a ne objekt. To znači da ćemo se zaključati na klasu, a ne na objekt. To se naziva statička sinkronizacija.
Slijedi još jedan primjer.
class Table{ //synchronized static method to print squares of numbers synchronized static void printTable(int n){ for(int i=1;i<=10;i++){ System.out.print(n*i + ' '); try{ Thread.sleep(400); }catch(Exception e){} } System.out.println(); } } //thread class Thread_One class Thread_One extends Thread{ public void run(){ Table.printTable(2); } } //thread class Thread_Two class Thread_Two extends Thread{ public void run(){ Table.printTable(5); } } public class Main{ public static void main(String t()){ //create instances of Thread_One and Thread_Two Thread_One t1=new Thread_One (); Thread_Two t2=new Thread_Two (); //start each thread instance t1.start(); t2.start(); } }
Izlaz
U gornjem programu ispisujemo tablice množenja brojeva. Svaki broj čija će se tablica ispisati predstavlja instancu niti različite klase niti. Tako ispisujemo tablice množenja od 2 i 5, tako da imamo dvije klase 'thread_one i thread_two za ispis tablica 2 i 5.
Da rezimiramo, sinkronizirana ključna riječ Java izvršava sljedeće funkcije:
- Sinkronizirana ključna riječ u Javi jamči međusobno isključiv pristup zajedničkim resursima pružajući mehanizam zaključavanja. Zaključavanje također sprječava uvjete utrke.
- Korištenjem sinkronizirane ključne riječi sprječavamo istodobne programske pogreške u kodu.
- Kada se metoda ili blok deklariraju kao sinkronizirani, tada nit treba ekskluzivnu blokadu za ulazak u sinkroniziranu metodu ili blok. Nakon izvršavanja potrebnih radnji, nit otpušta bravu i ispraznit će operaciju upisivanja. Na taj će način eliminirati pogreške u memoriji povezane s nedosljednošću.
Hlapljivo u Javi
Hlapljiva ključna riječ u Javi koristi se kako bi klase učinile nitima sigurnima. Također koristimo volatile ključnu riječ za izmjenu vrijednosti varijable različitim nitima. Hlapljiva ključna riječ može se koristiti za deklariranje varijable s primitivnim tipovima kao i objektima.
U određenim se slučajevima hlapljiva ključna riječ koristi kao alternativa sinkroniziranoj ključnoj riječi, ali imajte na umu da nije zamjena za sinkroniziranu ključnu riječ.
Kad se varijabla proglasi nestabilnom, njezina se vrijednost nikada ne sprema u keš, već se uvijek čita iz glavne memorije. Hlapljiva varijabla jamči poredak i vidljivost. Iako se varijabla može proglasiti volatilnom, klase ili metode ne možemo proglasiti volatilnim.
Razmotrite sljedeći blok koda:
class ABC{ static volatile int myvar =10; }
U gornjem kodu varijabla myvar je statična i hlapljiva. Statička varijabla dijeli se među svim objektima klase. Hlapljiva varijabla uvijek se nalazi u glavnoj memoriji i nikad se ne sprema u predmemoriju.
Stoga će u glavnoj memoriji biti samo jedna kopija myvara i sve radnje čitanja / pisanja izvršit će se na ovoj varijabli iz glavne memorije. Da myvar nije proglašen hlapljivim, tada bi svaki objekt niti imao različitu kopiju koja bi rezultirala nedosljednostima.
Neke od razlika između hlapljivih i sinkroniziranih ključnih riječi navedene su u nastavku.
Hlapljiva ključna riječ | Sinkronizirana ključna riječ |
---|---|
Hlapljiva ključna riječ koristi se samo s varijablama. | Sinkronizirana ključna riječ koristi se s blokovima koda i metodama. |
Hlapljiva ključna riječ ne može blokirati nit za čekanje. | Sinkronizirana ključna riječ može blokirati nit za čekanje. |
Izvedba niti poboljšava se s Volatile. | Performanse navoja donekle se pogoršavaju sinkroniziranim. |
Hlapljive varijable nalaze se u glavnoj memoriji. | Sinkronizirani konstrukti ne nalaze se u glavnoj memoriji. |
Hlapljivo istodobno sinkronizira jednu varijablu između memorije niti i glavne memorije. | Sinkronizirana ključna riječ sinkronizira sve varijable odjednom. |
Zastoj u Javi
Vidjeli smo da možemo sinkronizirati više niti pomoću sinkronizirane ključne riječi i programe učiniti nitima sigurnima. Sinkroniziranjem niti osiguravamo istodobno izvršavanje više niti u okruženju s više niti.
Međutim, ponekad se dogodi situacija u kojoj niti više ne mogu istodobno funkcionirati. Umjesto toga, čekaju beskrajno. To se događa kada jedna nit čeka na resursu, a drugi resurs blokira taj resurs.
S druge strane, druga nit čeka na resursu koji blokira prva nit. Takva situacija dovodi do 'mrtve točke' na Javi.
Zastoj u Javi prikazan je pomoću donje slike.
Kao što vidimo iz gornjeg dijagrama, nit A zaključala je resurs r1 i čeka resurs r2. S druge strane, nit B blokirao je resurs r2 i čeka na r1.
Stoga niti jedna od niti ne može izvršiti svoje izvršenje ako se ne domognu resursa na čekanju. Ova je situacija rezultirala zastojem u kojem obje niti beskrajno čekaju resurse.
Slijedi primjer slijepih mrtvih ulica u Javi.
public class Main { public static void main(String() args) { //define shared resources final String shared_res1 = 'Java tutorials'; final String shared_res2 = 'Multithreading'; // thread_one => locks shared_res1 then shared_res2 Thread thread_one = new Thread() { public void run() { synchronized (shared_res1) { System.out.println('Thread one: locked shared resource 1'); try { Thread.sleep(100);} catch (Exception e) {} synchronized (shared_res2) { System.out.println('Thread one: locked shared resource 2'); } } } }; // thread_two=> locks shared_res2 then shared_res1 Thread thread_two = new Thread() { public void run() { synchronized (shared_res2) { System.out.println('Thread two: locked shared resource 2'); try { Thread.sleep(100);} catch (Exception e) {} synchronized (shared_res1) { System.out.println('Thread two: locked shared resource 1'); } } } }; //start both the threads thread_one.start(); thread_two.start(); } }
Izlaz
U gornjem programu imamo dva zajednička resursa i dvije niti. Obje niti pokušavaju pristupiti dijeljenim resursima jedan po jedan. Izlaz prikazuje obje niti koje zaključavaju po jedan resurs dok čekaju ostale. Na taj način stvara se mrtva točka.
Iako ne možemo spriječiti da se situacije u mrtvoj točki dogode u potpunosti, sigurno ih možemo izbjeći poduzimanjem nekih koraka.
U nastavku su navedena sredstva pomoću kojih možemo izbjeći mrtve točke u Javi.
# 1) Izbjegavanjem ugniježđenih brava
Imati ugniježđene brave najvažniji je razlog zastoja. Ugniježđene brave su brave koje se daju više niti. Stoga bismo trebali izbjegavati davanje brava na više niti.
# 2) Koristite nit Join
Trebali bismo koristiti Thread.join s maksimalnim vremenom kako bi niti mogle iskoristiti maksimalno vrijeme za izvršenje. To će spriječiti zastoj koji se uglavnom događa dok jedna nit kontinuirano čeka druge.
# 3) Izbjegavajte nepotrebno zaključavanje
Trebali bismo zaključati samo potreban kod. Imati nepotrebne brave za kôd može dovesti do zastoja u programu. Kako zastoji mogu razbiti kôd i ometati tijek programa, trebali bismo biti skloni izbjegavanju zastoja u našim programima.
Često postavljana pitanja
P # 1) Što je sinkronizacija i zašto je važna?
Odgovor: Sinkronizacija je postupak upravljanja pristupom zajedničkom resursu više niti. Bez sinkronizacije, više niti može istodobno ažurirati ili promijeniti zajednički resurs što rezultira nedosljednostima.
Stoga bismo trebali osigurati da se u višenitnom okruženju niti sinkroniziraju tako da se način na koji pristupaju zajedničkim resursima međusobno isključuju i dosljedno.
P # 2) Što je sinkronizacija i nesinkronizacija u Javi?
Odgovor: Sinkronizacija znači da je konstrukcija zaštićena od niti. To znači da više niti ne može odjednom pristupiti konstrukciji (blok koda, metoda itd.).
Nesinkronizirani konstrukti nisu zaštićeni niti. Više niti može pristupiti nesinkroniziranim metodama ili blokovima u bilo kojem trenutku. Popularna nesinkronizirana klasa u Javi je StringBuilder.
P # 3) Zašto je potrebna sinkronizacija?
Odgovor: Kada se procesi trebaju istodobno izvršavati, potrebna nam je sinkronizacija. To je zato što su nam potrebni resursi koji se mogu dijeliti među mnogim procesima.
Da bismo izbjegli sukobe između procesa ili niti za pristup zajedničkim resursima, moramo ih sinkronizirati tako da sve niti dobiju pristup resursima, a aplikacija također nesmetano radi.
P # 4) Kako doći do sinkroniziranog ArrayList-a?
Odgovor: Možemo koristiti metodu Collections.synchronized list s ArrayListom kao argumentom za pretvorbu ArrayList u sinkronizirani popis.
P # 5) Je li HashMap sinkroniziran?
vrsta testiranja u razvoju softvera
Odgovor: Ne, HashMap nije sinkroniziran, ali HashTable je sinkroniziran.
Zaključak
U ovom uputstvu detaljno smo razgovarali o sinkronizaciji niti. Uz to smo također saznali o hlapljivoj ključnoj riječi i zastojima u Javi. Sinkronizacija se sastoji od sinkronizacije procesa i niti.
U okruženju s više niti više nas zanima sinhronizacija niti. Ovdje smo vidjeli pristup sinkronizirane ključne riječi sinkronizacije niti.
Zastoj je situacija u kojoj više niti beskrajno čeka resurse. Vidjeli smo primjer zastoja u Javi zajedno s metodama za izbjegavanje zastoja u Javi.
=> Posjetite ovdje da biste naučili Javu ispočetka.
Preporučena literatura
- Thread.Sleep () - metoda spavanja niti () u Javi s primjerima
- Java niti s metodama i životnim ciklusom
- Osnove Java: Java sintaksa, Java klasa i osnovni koncepti Java
- Multithreading u Javi - Vodič s primjerima
- Višenitnost u jeziku C ++ s primjerima
- JAVA Tutorial za početnike: 100+ praktičnih Java Video tutorijala
- Java komponente: Java platforma, JDK, JRE i Java virtualni stroj
- Java String Vodič | Metode Java niza s primjerima