Synkronisering i Java: Hvad, hvordan og hvorfor?



Denne artikel om synkronisering i Java hjælper dig med at guide dig vej til at lære om synkronisering af multitrådede programmer.

Programmer med flere tråde kan regelmæssigt komme med en omstændighed, hvor flere forsøg på at komme til den samme ressource, der giver falske og forbløffende resultater. Dette kan løses ved hjælp af synkronisering i Java. Bare en enkelt specifik tråd kan komme til ressourcen ved et givet tidspunkt. Denne artikel hjælper dig med at blive fortrolig med synkroniseringsstrategien.

Jeg diskuterer emnerne i denne rækkefølge:





def __init__ i python

Lad os komme igang!

Hvorfor bruge synkronisering i Java?



Hvis du starter med mindst to tråde inde i et program, er der muligvis en chance, når flere tråde forsøger at komme til den samme ressource. Det kan endda skabe et uventet resultat på grund af problemer med samtidighed.

Syntaks :

synkroniseret (objectidentifier) ​​{// Få adgang til delte variabler og andre delte ressourcer}

For eksempel, forsøg på at skrive i en tilsvarende fil. Dette kan ødelægge dataene, da en af ​​trådene kan tilsidesætte dataene, eller når en tråd åbnersamme fil på samme tid, kan en anden tråd muligvis lukke den samme fil.Der er behov for at synkronisere handlingen af ​​flere tråde. Dette kan implementeres ved hjælp af et koncept kaldet M onitors .



  • Hver er forbundet med en skærm, som en tråd kan låse eller låse op.
  • Kun en tråd ad gangen kan indeholde en lås på en skærm.
  • Java programmeringssprog giver en meget praktisk måde at oprette tråde på og synkronisere deres opgave ved hjælp af Synkroniseret blokke.
  • Det holder også de delte ressourcer inden for denne særlige blok.

Synkroniserede blokke i Java er markeret med Synkroniseret nøgleord. Denne blok i Java er synkroniseret på et eller andet objekt.Alle blokke, der er synkroniseret på det samme objekt, kan kun have én tråd udført ad gangen. Alle andre tråde, der forsøger at komme ind i den synkroniserede blok, blokeres, indtil tråden inde i den synkroniserede blok forlader blokken.

Typer af synkronisering

Der er grundlæggende to typer synkronisering til rådighed. De er:

  1. Processynkronisering: Den samtidige udførelse af flere tråde eller processer for at nå en tilstand, således at de forpligter sig til en bestemt rækkefølge af handlinger.
  2. Trådsynkronisering: Til tider, hvor mere end en trådforsøger at få adgang til en delt ressource, skal du sikre, at ressourcen kun bruges af en tråd påen tid.

Lad os ikke komme nærmere ind på disse typer og prøve at forstå, hvad der er låst inde .

Låser i Java

Som jeg nævnte tidligere, er synkronisering bygget op omkring en intern enhed kendt som låse eller overvåge . Hver eneste genstand er forbundet med en lås. Så en tråd, der har brug for ensartet adgang til et objekts felter, skal erhverve objektets lås, før de får adgang til dem, og derefter frigøre låsen, når arbejdet er udført.

Fra Java 5 indeholder pakken java.util.concurrent.locks mange låsimplementeringer.

Sådan ser en lås ud:

offentlig klasselås {privat boolsk isLocked = falsk offentlig synkroniseret ugyldig lås () kaster InterruptedException {mens (isLocked) {vent ()} isLocked = sand} offentlig synkroniseret tom oplåsning () {isLocked = falsk underret ()}}

Låsen () -metoden låser låseforekomsten, så alle tråde, der kalder lås (), blokeres, indtil oplåsning () udføres.

Multi-threading uden synkronisering

Her er et simpelt eksempel, der udskriver tællerværdien i en sekvens, og hver gang vi kører den, producerer den et andet resultat baseret på CPU-tilgængelighed til en tråd. Se lige det her!

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

Ovenstående program resulterer i dette:

Output- Synkronisering i Java- Edureka

Multi-threading med synkronisering

Dette er det samme eksempel som ovenfor, men det udskriver tællerværdien i sekvensen. Hver gang vi kører det, producerer det det samme resultat.

klasse Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Undtagelse e) {System. out.println ('Tråd afbrudt.')}}} klasse Tråd udvides Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synkroniseret ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public ugyldig start () {System.out.println ('Start' + threadName) hvis (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) Tråd T1 = ny tråd (' Tråd - 2 ', MT) T.start () T1.start () // vent på at tråde slutter, prøv {T.join () T1.join ()} fange (Undtagelse e) {System.out.println ('Afbrudt')}}}

Outputtet er vist nedenfor:

hvordan man opretter en pakke i java

Synkroniseret nøgleord

synkroniseret nøgleord markerer en blok eller en metode som et kritisk afsnit. Et kritisk afsnit er hvor kun en tråd udføres ad gangen, og tråden holder låsen til det synkroniserede afsnit. Dette synkroniseret nøgleord hjælper med at skrive samtidig dele af enhver applikation. Det beskytter også delte ressourcer inden for blokken.

Det synkroniserede nøgleord kan bruges med:

Lad os diskutere kodeblokken.

Synkroniseret nøgleord: En kodeblok

Syntaks

Den generelle syntaks til at skrive en synkroniseret blok er:

synkroniseret (lockObject) {// synkroniserede udsagn}

Når en tråd ønsker at udføre de synkroniserede udsagn inde i blokken, skal den erhverve låsen på lockObject's skærm. Kun en tråd kan erhverve skærmen på et låseobjekt ad gangen. Så alle andre tråde skal vente, indtil den aktuelt udførende tråd erhverver låsen og afslutter dens udførelse.
På denne måde synkroniseret nøgleord garanterer, at kun en tråd udfører de synkroniserede blokudtalelser ad gangen og dermed forhindrer flere tråde i at ødelægge de delte data, der er til stede inde i blokken.

Bemærk :

  • Hvis en tråd sættes på vågeblus (ved hjælp af søvn() metode) så frigøres ikke låsen. I løbet af denne hviletid udfører ingen tråd de synkroniserede blokerklæringer.
  • Java-synkronisering vil kaste NullPointerException hvis låseobjekt bruges i ' synkroniseret (lås) 'Er nul.

Lad os nu diskutere metoden.

Synkroniseret nøgleord: En metode

Syntaks

Den generelle syntaks til skrivning af en synkroniseret metode er:

c ++ kald ved reference
synkroniseret metode (parametre) {// synkroniseret kode}

Her lockObject er kun en henvisning til et objekt, hvis lås er knyttet til skærmen, der repræsenterer de synkroniserede udsagn.

I lighed med den synkroniserede blok skal en tråd erhverve låsen på det tilsluttede skærmobjekt med den synkroniserede metode. I tilfælde af en synkroniseret metode er låsegenstanden:

  • '.Class' objekt - hvis den givne metode er statisk .
  • 'Dette' objekt - hvis metoden er ikke-statisk . 'Dette' er henvisningen til det aktuelle objekt, hvor den synkroniserede metode påberåbes.

Java synkroniseret nøgleord er genindtrædende i naturen. Det betyder, at hvis en synkroniseret metode kalder en anden synkroniseret metode, der kræver den samme lås, så kan den aktuelle tråd, der holder låsen, gå ind i denne metode uden at erhverve låsen.

Lad os gå videre til det sidste emne i denne artikel og påpege de store forskelle mellem det synkroniserede nøgleord og synkroniseringsblokken.

Forskel mellem synkroniseret nøgleord og synkroniseret blok

  • Når du bruger synkroniseret nøgleord med en metode , det erhverver en lås i objektet til hele metoden. Dette betyder, at ingen anden tråd kan bruge nogen synkroniseret metode, før den aktuelle tråd, der påberåbes, er færdig med dens udførelse.
  • Synkroniseret blok erhverver kun en lås i objektet mellem parenteser, efter at det synkroniserede nøgleord er angivet. Dette betyder, at ingen anden tråd kan erhverve en lås på det allerede låste objekt, før blokken går ud. Men andre tråde vil være i stand til at få adgang til resten af ​​koden, der er til stede i metoden.

Dette bringer os til slutningen af ​​denne artikel, hvor vi har diskuteret, hvordan nøjagtig synkronisering i Java fungerer. Håber du er klar med alt, hvad der er delt med dig i denne vejledning.

Tjek den af Edureka, et pålideligt online læringsfirma med et netværk på mere end 250.000 tilfredse elever spredt over hele kloden. Vi er her for at hjælpe dig med hvert trin på din rejse, for at blive et ud over dette java-interviewspørgsmål, kommer vi med en læseplan, der er designet til studerende og fagfolk, der ønsker at være Java-udvikler.

Har du et spørgsmål til os? Nævn det i kommentarfeltet i denne “Synkronisering i Java ' artikel, og vi vender tilbage til dig så hurtigt som muligt.