Sincronizarea în Java: ce, cum și de ce?



Acest articol despre Sincronizarea în Java vă va ajuta să vă ghidați drumul spre a afla despre sincronizarea programelor multi-thread.

Programele multi-thread pot veni în mod regulat cu o situație în care sunt multiple încercați să ajungeți la aceeași resursă care produce rezultate frauduloase și uimitoare. Acest lucru poate fi rezolvat utilizând sincronizarea în Java. Doar un singur fir specific poate ajunge la resursă într-un anumit scop de timp. Acest articol vă va ajuta să vă familiarizați cu strategia de sincronizare.

Voi discuta subiectele în această ordine:





Să începem!

De ce să folosim sincronizarea în Java?



Dacă începeți cu cel puțin două fire în interiorul unui program, ar putea exista o șansă când mai multe fire încearcă să ajungă la aceeași resursă. Poate crea chiar un rezultat neașteptat din cauza problemelor de concurență.

Sintaxă :

sincronizat (identificator de obiect) {// Accesați variabilele partajate și alte resurse partajate}

De exemplu, încercați să scrieți într-un fișier echivalent. Acest lucru poate deteriora datele, deoarece unul dintre fire poate anula datele sau când un fir deschide fișierulacelași fișier în același timp, un alt fir ar putea închide același fișier.Este nevoie să sincronizați acțiunea mai multor fire. Acest lucru poate fi implementat folosind un concept numit M onitori .



  • Fiecare este asociat cu un monitor, pe care un fir îl poate bloca sau debloca.
  • Numai un fir la un moment dat poate bloca un monitor.
  • Java limbajul de programare oferă un mod foarte la îndemână de a crea fire și de a sincroniza sarcinile acestora utilizând Sincronizat blocuri.
  • De asemenea, păstrează resursele partajate în cadrul acestui bloc special.

Blocurile sincronizate din Java sunt marcate cu Sincronizat cuvânt cheie. Acest bloc din Java este sincronizat pe un obiect.Toate blocurile care sunt sincronizate pe același obiect pot avea un singur fir executat în interiorul lor la un moment dat. Toate celelalte fire care încearcă să intre în blocul sincronizat sunt blocate până când firul din interiorul blocului sincronizat iese din bloc.

Tipuri de sincronizare

Există practic două tipuri de sincronizare disponibile. Sunt:

  1. Sincronizare proces: Executarea simultană a mai multor fire sau procese pentru a ajunge la o stare astfel încât să se angajeze la o anumită succesiune de acțiuni.
  2. Sincronizarea firului: În momente în care mai mult de un firîncearcă să acceseze o resursă partajată, trebuie să vă asigurați că resursa va fi utilizată de un singur fir lao vreme.

Să nu intrăm în detaliile acestor tipuri și să încercăm să înțelegem ce sunt blocările .

Încuietori în Java

După cum am menționat mai devreme, sincronizarea este construită în jurul unei entități interne cunoscute sub numele de Lacăt sau monitor . Fiecare obiect are asociat un blocaj. Deci, un fir care are nevoie de acces consecvent la câmpurile unui obiect trebuie să dobândească încuietoarea obiectului înainte de a le accesa, apoi să elibereze încuietoarea la finalizarea lucrării.

Din Java 5, pachetul java.util.concurrent.locks conține multe implementări de blocare.

Așa arată o încuietoare:

public class Lock {private boolean isLocked = false public synchronized void lock () throws InterruptedException {while (isLocked) {wait ()} isLocked = true} public synchronized void unlock () {isLocked = false notification ()}}

Metoda lock () blochează instanța Lock astfel încât toate firele care apelează lock () să fie blocate până când se execută unlock ().

ce sunt pachetele în java

Multi-threading fără sincronizare

Iată un exemplu simplu care tipărește valoarea contorului într-o secvență și de fiecare dată când o rulăm, produce un rezultat diferit pe baza disponibilității procesorului la un fir. Verificați acest lucru!

class 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') } } }

Programul de mai sus are ca rezultat:

Ieșire- Sincronizare în Java- Edureka

Multi-threading cu sincronizare

Acesta este același exemplu ca mai sus, dar imprimă valoarea contorului în secvență. De fiecare dată când îl rulăm, produce același rezultat.

class Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Exception e) {System. out.println ('Thread întrerupt.')}}} clasă Thread extinde Multithread {Private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synchronized ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Start' + threadName) if (t == null) {t = thread nou (this, threadName) t.start ()}}} public class TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = thread nou ('Thread - 1 ', MT) Fir T1 = fir nou (' Fir - 2 ', MT) T.start () T1.start () // așteptați finalizarea firelor, încercați {T.join () T1.join ()} catch (Excepție e) {System.out.println ('Întrerupt')}}}

Ieșirea este descrisă mai jos:

Cuvânt cheie sincronizat

iso 9000 vs six sigma

cuvânt cheie sincronizat marchează un bloc sau o metodă o secțiune critică. O secțiune critică este în cazul în care se execută un singur fir la un moment dat, iar firul deține blocarea pentru secțiunea sincronizată. Acest sincronizat cuvântul cheie ajută la scriere concurente părți ale oricărei aplicații. De asemenea, protejează resursele partajate din cadrul blocului.

Cuvântul cheie sincronizat poate fi utilizat cu:

Să discutăm blocul de cod.

Cuvânt cheie sincronizat: un bloc de cod

Sintaxă

Sintaxa generală pentru scrierea unui bloc sincronizat este:

sincronizat (lockObject) {// declarații sincronizate}

Atunci când un thread dorește să execute declarațiile sincronizate în interiorul blocului, acesta trebuie să obțină blocarea pe monitorul lockObject. Un singur fir poate obține monitorul unui obiect de blocare la un moment dat. Deci, toate celelalte fire trebuie să aștepte până când firul în curs de executare dobândește blocarea și termină executarea acestuia.
În acest fel, sincronizat cuvântul cheie garantează că un singur fir va executa instrucțiunile de bloc sincronizate la un moment dat și, astfel, împiedică mai multe fire de corupție a datelor partajate care sunt prezente în interiorul blocului.

Notă :

  • Dacă un fir este pus în somn (folosind dormi() metoda) atunci nu eliberează încuietoarea. În acest timp de repaus, niciun fir nu va executa instrucțiunile de bloc sincronizate.
  • Sincronizarea Java va fi lansată NullPointerException dacă obiectul de blocare utilizat în „ sincronizat (blocare) ‘Este nul.

Acum, să discutăm despre metodă.

Cuvânt cheie sincronizat: O metodă

Sintaxă

Sintaxa generală pentru scrierea unui metoda sincronizată este:

metodă sincronizată (parametri) {// cod sincronizat}

Aici lockObject este doar o referință la un obiect a cărui blocare este asociată cu monitorul care reprezintă declarațiile sincronizate.

Similar blocului sincronizat, un fir trebuie să obțină blocarea obiectului monitor conectat cu metoda sincronizată. În cazul metodei sincronizate, obiectul de blocare este:

  • Obiect ‘.class’ - dacă metoda dată este static .
  • Obiectul „acest” - dacă metoda este nestatic . „Acesta” este referința la obiectul curent în care este invocată metoda sincronizată.

Cuvântul cheie sincronizat Java este reintrare în natură. Înseamnă că dacă o metodă sincronizată apelează o altă metodă sincronizată care necesită aceeași blocare, atunci firul curent care deține blocarea poate intra în acea metodă fără a dobândi blocarea.

Să trecem la subiectul final al acestui articol și să arătăm diferențele majore dintre cuvântul cheie sincronizat și blocul de sincronizare.

Diferența dintre cuvântul cheie sincronizat și blocul sincronizat

  • Când utilizați cuvânt cheie sincronizat cu un metodă , dobândește un blocaj în obiect pentru întreaga metodă. Aceasta înseamnă că niciun alt fir nu poate utiliza nicio metodă sincronizată până când firul curent invocat nu și-a terminat execuția.
  • Sincronizat bloc obține o blocare a obiectului numai între paranteze după specificarea cuvântului cheie sincronizat. Aceasta înseamnă că niciun alt fir nu poate obține o blocare pe obiectul deja blocat până când blocul nu iese. Dar alte fire vor putea accesa restul codului care este prezent în metodă.

Acest lucru ne duce la sfârșitul acestui articol, unde am discutat cum funcționează exact sincronizarea în Java. Sper că ești clar cu tot ce ți-a fost împărtășit în acest tutorial.

Verificați de Edureka, o companie de învățare online de încredere, cu o rețea de peste 250.000 de elevi mulțumiți răspândiți pe tot globul. Suntem aici pentru a vă ajuta cu fiecare pas din călătoria dvs., pentru a deveni o afară de aceste întrebări java interviu, venim cu un curriculum care este conceput pentru studenți și profesioniști care doresc să fie un dezvoltator Java.

Ai o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii a acestui „Sincronizare în Java ' articol și vă vom răspunde cât mai curând posibil.