Ghid cuprinzător pentru sincronizare în Java

Publicat: 2022-05-20

Înainte de a explica sincronizarea în Java , trebuie să revizuim pe scurt conceptul de multithreading. Caracteristica multithreading a Java permite executarea simultană a două sau mai multe părți ale unui program pentru o utilizare maximă a CPU. Fiecare parte a unui astfel de program este un fir, iar firele sunt procese ușoare din cadrul unui proces.

Acum, mai multe fire ale unui program pot încerca să acceseze aceleași resurse și să producă rezultate inexacte. Deci, trebuie să existe o anumită sincronizare pentru a se asigura că doar un fir are acces la resurse la un moment dat.

Acest ghid despre ceea ce este sincronizarea în Java va explora conceptul de sincronizare în detaliu cu exemple.

Cuprins

Ce este sincronizarea în Java?

Sincronizarea Java este capacitatea de a controla accesul mai multor fire de execuție la o resursă partajată. Este util atunci când programele Java cu mai multe fire încearcă să acceseze aceeași resursă și să producă rezultate eronate. Folosind caracteristica de sincronizare Java, doar un singur fir poate ajunge la resursă la un moment dat.

Java oferă o modalitate de a sincroniza sarcina firelor de execuție folosind blocuri sincronizate care se sincronizează pe același obiect și pot avea doar un fir de execuție în interiorul lor odată. Aceste blocuri sunt marcate cu cuvântul cheie synchronized, blocând orice alt fir care încearcă să intre în blocul sincronizat până când firul aflat deja în bloc își încheie execuția și părăsește blocul.

Sintaxa pentru scrierea unui bloc sincronizat

Sintaxa generală pentru scrierea unui bloc sincronizat în Java este următoarea:

sincronizat( lockObject )

{

// instrucțiuni sincronizate

}

În sintaxa de mai sus, lockObject se referă la un obiect a cărui blocare este legată de elementele sincronizate. Acum, asta ne aduce la conceptul de blocare în Java.

Blocări în Java

Sincronizarea în Java este construită în jurul lacătului sau monitorului. Fiecare obiect are asociat o blocare. În mod ideal, un fir care necesită acces la câmpurile unui obiect trebuie să obțină mai întâi blocarea obiectului. Blocarea este un mecanism de sincronizare a firelor mai sofisticat și mai flexibil decât blocul de sincronizare. Este definit în pachetul java.util.concurrent.lock care conține implementări extinse de blocare.

Învață cursuri online de dezvoltare software de la cele mai bune universități din lume. Câștigați programe Executive PG, programe avansate de certificat sau programe de master pentru a vă accelera cariera.

Metoda sincronizată Java

Scopul unei metode sincronizate Java este de a bloca obiecte pentru resurse partajate. Astfel, atunci când firele de execuție invocă o metodă sincronizată, metoda primește automat blocarea pentru acel obiect și o eliberează odată ce firul de execuție își execută sarcina.

Iată un exemplu de metodă sincronizată Java:

//exemplu de metodă sincronizată java

Tabelul clasei{

sincronizat void printTable(int n){//metoda sincronizată

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

System.out.println(n*i);

încerca{

Thread.sleep(400);

}catch(Excepția e){System.out.println(e);}

}

}

}

clasa MyThread1 extinde Thread{

Tabelul t;

MyThread1(Tabelul t){

aceasta.t=t;

}

public void run(){

t.printTable(5);

}

}

clasa MyThread2 extinde Thread{

Tabelul t;

MyThread2(Tabelul t){

aceasta.t=t;

}

public void run(){

t.printTable(100);

}

}

clasa publică TestSynchronization2{

public static void main(String args[]){

Table obj = new Table();//doar un singur obiect

MyThread1 t1=new MyThread1(obj);

MyThread2 t2=new MyThread2(obj);

t1.start();

t2.start();

}

}

Ieșire:

5

10

15

20

25

100

200

300

400

500

Ce se întâmplă fără sincronizare?

Acum, să ne uităm la programul anterior fără sincronizare (rețineți absența cuvântului cheie sincronizat).

Tabelul clasei{

void printTable(int n){//metoda nu este sincronizată

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

System.out.println(n*i);

încerca{

Thread.sleep(400);

}catch(Excepția e){System.out.println(e);}

}

}

}

clasa MyThread1 extinde Thread{

Tabelul t;

MyThread1(Tabelul t){

aceasta.t=t;

}

public void run(){

t.printTable(5);

}

}

clasa MyThread2 extinde Thread{

Tabelul t;

MyThread2(Tabelul t){

aceasta.t=t;

}

public void run(){

t.printTable(100);

}

}

clasa TestSynchronization1{

public static void main(String args[]){

Table obj = new Table();//doar un singur obiect

MyThread1 t1=new MyThread1(obj);

MyThread2 t2=new MyThread2(obj);

t1.start();

t2.start();

}

}

Ieșire:

5

100

10

200

15

300

20

400

25

500

După cum puteți vedea, ieșirea este inconsecventă fără sincronizare.

Explorați cursurile noastre populare de inginerie software

SL. Nu Programe de dezvoltare software
1 Master în Informatică de la LJMU și IIITB Programul de certificat de securitate cibernetică Caltech CTME
2 Bootcamp de dezvoltare completă Programul PG în Blockchain
3 Program Executive Postuniversitar în Dezvoltare Software - Specializare în DevOps Vezi toate cursurile de Inginerie software

Tipuri de sincronizare în Java

Pentru a răspunde la ce este sincronizarea firelor în Java , avem două tipuri de sincronizare disponibile: sincronizarea firelor și sincronizarea proceselor.

Să înțelegem ce înseamnă fiecare.

Sincronizarea firelor de execuție: Când mai multe fire de execuție încearcă să acceseze o resursă partajată, trebuie să ne asigurăm că resursa este utilizată de un singur fir la un moment dat. Sincronizarea firelor de execuție este procesul de a permite unui singur fir să utilizeze resursa partajată atunci când mai multe fire de execuție încearcă să utilizeze resursa simultan.

Sincronizarea proceselor: se referă la execuția simultană a mai multor procese pentru a ajunge la o stare în care procesele se angajează la o ordine adecvată de execuție. Sincronizarea proceselor este necesară atunci când două sau mai multe procese cooperează, iar execuția unui proces îl afectează pe celălalt. Astfel, sincronizarea proceselor elimină posibilitatea unor ieșiri inexacte și garantează ordinea de execuție corectă.

Metode de sincronizare în Java

În general, există patru metode de sincronizare în Java:

  • Metode statice sincronizate
  • Metode de instanță sincronizate
  • Bloc sincronizat în cadrul metodelor statice
  • Bloc sincronizat în interiorul metodelor de instanță

Să ne uităm la fiecare metodă de sincronizare Java mai detaliat.

Metode statice sincronizate

Aici, folosim cuvântul cheie sincronizat pentru a marca metodele statice în Java. Iată un exemplu de metodă statică sincronizată Java:

public static MyStaticCounter {

private static int count = 0;

public static sincronizat void increment(int value) {

numărare += valoare;

}

}

Metode de instanță sincronizate

Când utilizați un bloc sincronizat cu metode de instanță, fiecare obiect are metoda sa sincronizată. Fiecare obiect poate avea un singur fir care se poate executa în interiorul unei metode. Dacă există mai multe obiecte, se poate executa un singur fir pentru fiecare obiect din interiorul blocului.

clasă publică MyCounter {

private int count = 0;

public sincronizat void increment(int value) {

aceasta.număr += valoare;

}

public sincronizat void decrement(int value) {

this.count -= valoare;

}

}

Bloc sincronizat în cadrul metodelor statice

Mai jos este un exemplu în care folosim un bloc sincronizat în interiorul unei metode statice:

clasă publică MyClass {

public static void print(Mesaj șir) {

sincronizat(MyClass.class) {

log.writeln(mesaj);

}

}

}

Bloc sincronizat în interiorul metodelor de instanță

În loc să sincronizăm întreaga metodă, putem folosi sincronizat pe un anumit bloc din cadrul metodei. Mai jos este un exemplu de bloc de cod sincronizat în interiorul unei metode nesincronizate:

public void increment(int value) {

sincronizat(asta) {

aceasta.număr += valoare;

}

}

Nevoia de sincronizare în Java

Acum că știți ce este sincronizarea în Java , s-ar putea să vă întrebați de ce o folosim în primul rând.

Cuvântul cheie Java sincronizat oferă funcționalități esențiale pentru programarea concomitentă. Iată cum ajută sincronizarea în Java:

  • Sincronizarea Java oferă caracteristica de blocare pentru a elimina orice condiție de concurență între fire și pentru a asigura accesul exclusiv exclusiv la resursa partajată.
  • Blocarea sincronizată Java oferă atât funcțiile de blocare, cât și de deblocare. Deci, un fir trebuie să obțină blocarea înainte de a intra într-o metodă sau bloc sincronizat.
  • Cuvântul cheie sincronizat împiedică reordonarea instrucțiunilor programului de către compilator.

Concluzie

În concluzie, sincronizarea în Java se asigură că doar un fir poate accesa resursa partajată la un moment dat. Putem realiza un bloc sau o metodă sincronizată folosind cuvântul cheie Java synchronized. Când un fir vrea să intre într-un bloc sincronizat, trebuie să dobândească o blocare, iar după ce părăsește blocul, firul eliberează blocarea. Putem folosi cuvântul cheie sincronizat fie cu metode, fie în interiorul blocului unei metode.

Te întrebi unde să înveți Java?

Certificarea upGrad PG legată de locuri de muncă în inginerie software este ceea ce cauți!

Special concepută pentru proaspeții absolvenți și ultimii ani, certificarea upGrad PG legată de locuri de muncă în inginerie software este perfectă pentru cei care doresc să învețe să programeze și să fie plasați în roluri de software de nivel de intrare. Acest program online de 5 luni va preda abilități software de top precum Java, JavaScript, HTML5, DSA, AWS, MERN și multe altele!

Î: De ce folosim sincronizat în Java?

R: Cuvântul cheie sincronizat din Java asigură că doar un fir poate accesa resursele partajate la un moment dat. Este util atunci când programele Java cu mai multe fire încearcă să acceseze aceeași resursă și să producă rezultate inexacte.

Î: Cum este implementată sincronizarea în Java?

R: Java implementează sincronizarea folosind conceptul de monitoare cu un singur fir deținând un monitor la un moment dat. Când un fir de execuție obține o blocare, are acces la monitor și toate celelalte fire care încearcă să intre în monitorul blocat rămân blocate până când primul fir de execuție părăsește monitorul.

Î: Ce este un blocaj în Java?

R: Deadlock Java apare atunci când un fir de execuție așteaptă o blocare a obiectului, dar un alt thread o dobândește, iar al doilea thread așteaptă o blocare a obiectului dobândită de primul. Prin urmare, ambele fire se așteaptă unul pe celălalt să elibereze blocarea, rezultând un blocaj.