Synkronisering i Java: Hva, hvordan og hvorfor?



Denne artikkelen om synkronisering i Java vil hjelpe deg med å veilede deg for å lære om synkronisering av flertrådede programmer.

Programmer med flere tråder kan regelmessig komme opp med en omstendighet der flere forsøke å komme til samme ressurs som gir falske og oppsiktsvekkende resultater. Dette kan løses ved å bruke synkroniseringen i Java. Bare en enkelt tråd kan komme til ressursen ved et gitt tidsformål. Denne artikkelen vil hjelpe deg å bli kjent med synkroniseringsstrategien.

Jeg skal diskutere emnene i denne rekkefølgen:





La oss komme i gang!

Hvorfor bruke synkronisering i Java?



Hvis du starter med minst to tråder i et program, kan det være en sjanse når flere tråder prøver å komme til samme ressurs. Det kan til og med skape et uventet resultat på grunn av problemer med samtidighet.

Syntaks :

synkronisert (objectidentifier) ​​{// Få tilgang til delte variabler og andre delte ressurser}

For eksempel, forsøk å skrive i en tilsvarende fil. Dette kan ødelegge dataene siden en av trådene kan overstyre dataene eller når en tråd åpnersamme fil samtidig, kan det hende at en annen tråd lukker den samme filen.Det er behov for å synkronisere handlingen til flere tråder. Dette kan implementeres ved hjelp av et konsept som heter M onitors .



  • Hver er tilknyttet en skjerm, som en tråd kan låse eller låse opp.
  • Bare en tråd om gangen kan holde en lås på en skjerm.
  • Java programmeringsspråk gir en veldig praktisk måte å opprette tråder og synkronisere oppgaven med Synkronisert blokker.
  • Det holder også de delte ressursene innenfor denne spesielle blokken.

Synkroniserte blokker i Java er merket med Synkronisert nøkkelord. Denne blokken i Java er synkronisert på et eller annet objekt.Alle blokker som er synkronisert på det samme objektet, kan bare ha en tråd utført om gangen. Alle andre tråder som prøver å gå inn i den synkroniserte blokken, blokkeres til tråden inne i den synkroniserte blokken kommer ut av blokken.

Typer synkronisering

Det er i utgangspunktet to typer synkronisering tilgjengelig. De er:

  1. Prosess-synkronisering: Samtidig utføring av flere tråder eller prosesser for å nå en tilstand slik at de forplikter seg til en bestemt sekvens av handlinger.
  2. Trådesynkronisering: Til tider når mer enn en trådprøver å få tilgang til en delt ressurs, må du sørge for at ressursen bare brukes av en tråd påen gang.

La oss ikke komme inn på detaljene av disse typene og prøve å forstå hva som er låst inn .

Låser i Java

Som jeg nevnte tidligere, er synkronisering bygget rundt en intern enhet kjent som låse eller Observere . Hver eneste gjenstand har en lås knyttet til seg. Så en tråd som trenger jevn tilgang til et objekts felt, må skaffe seg objektets lås før du får tilgang til dem, og deretter slippe låsen når arbeidet er gjort.

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

Slik ser en lås ut:

offentlig klasselås {privat boolsk isLocked = falsk offentlig synkronisert ugyldig lås () kaster InterruptedException {mens (isLocked) {vent ()} isLocked = true} offentlig synkronisert ugyldig opplåsing () {isLocked = false notify ()}}

Låsen () -metoden låser låseforekomsten slik at alle tråder som ringer lås () blokkeres til opplåsing () utføres.

Multi-threading uten synkronisering

Her er et enkelt eksempel som skriver ut tellerverdien i en sekvens, og hver gang vi kjører den, produserer den et annet resultat basert på CPU-tilgjengelighet til en tråd. Sjekk ut dette!

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

Ovennevnte programresultater i dette:

Utgang- Synkronisering i Java- Edureka

Multi-threading med synkronisering

Dette er det samme eksemplet som ovenfor, men det skriver ut tellerverdien i sekvensen. Hver gang vi kjører den, gir den det samme resultatet.

java dypkopi mot grunne kopi
klasse Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Unntak e) {System. out.println ('Tråden avbrutt.')}}} klasse Tråd utvides Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {synkronisert ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starter' + 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) Tråd T1 = ny tråd (' Tråd - 2 ', MT) T.start () T1.start () // vent på at tråder slutter, prøv {T.join () T1.join ()} fange (Unntak e) {System.out.println ('Avbrutt')}}}

Resultatet er avbildet nedenfor:

Synkronisert nøkkelord

synkronisert nøkkelord markerer en blokk eller en metode som en kritisk del. En kritisk seksjon er der bare en tråd utføres om gangen, og tråden holder låsen for den synkroniserte seksjonen. Dette synkronisert nøkkelord hjelper skriftlig samtidig deler av enhver applikasjon. Det beskytter også delte ressurser i blokken.

Det synkroniserte nøkkelordet kan brukes med:

La oss diskutere kodeblokken.

Synkronisert nøkkelord: En kodeblokk

Syntaks

Den generelle syntaksen for å skrive en synkronisert blokk er:

synkronisert (lockObject) {// synkroniserte uttalelser}

Når en tråd vil utføre de synkroniserte utsagnene inne i blokken, må den anskaffe låsen på lockObject-skjermen. Bare en tråd kan skaffe skjermen til en låsegjenstand om gangen. Så alle andre tråder må vente til den nåværende utførende tråden anskaffer låsen og fullfører kjøringen.
På denne måten, synkronisert nøkkelord garanterer at bare en tråd vil utføre de synkroniserte blokkeringsuttrykkene om gangen, og dermed forhindrer flere tråder å ødelegge de delte dataene som er tilstede inne i blokken.

Merk :

  • Hvis en tråd blir satt på søvn (ved hjelp av sove() metode), da frigjør den ikke låsen. I løpet av denne hviletiden vil ingen tråd utføre de synkroniserte blokkuttrykkene.
  • Java-synkronisering vil kaste NullPointerException hvis låseobjekt brukes i synkronisert (lås) ‘Er null.

La oss nå diskutere metoden.

Synkronisert nøkkelord: En metode

Syntaks

Den generelle syntaksen for å skrive a synkronisert metode er:

synkronisert metode (parametere) {// synkronisert kode}

Her lockObject er bare en referanse til et objekt hvis lås er knyttet til skjermen som representerer de synkroniserte setningene.

I likhet med den synkroniserte blokken, må en tråd hente låsen på det tilkoblede skjermobjektet med den synkroniserte metoden. I tilfelle av synkronisert metode er låsegjenstanden:

  • ‘.Class’ objekt - hvis den gitte metoden er statisk .
  • ‘Dette’ objektet - hvis metoden er det ikke-statisk . ‘Dette’ er referansen til det nåværende objektet der den synkroniserte metoden påkalles.

Java synkronisert nøkkelord er re-deltaker i naturen. Det betyr at hvis en synkronisert metode kaller en annen synkronisert metode som krever samme lås, kan gjeldende tråd som holder låsen gå inn i den metoden uten å anskaffe låsen.

La oss gå videre til det siste emnet i denne artikkelen og påpeke de store forskjellene mellom det synkroniserte nøkkelordet og synkroniseringsblokken.

Forskjellen mellom synkronisert nøkkelord og synkronisert blokk

  • Når du bruker synkronisert nøkkelord med en metode , får den en lås i objektet for hele metoden. Dette betyr at ingen andre tråder kan bruke noen synkronisert metode før den gjeldende tråden som blir påkalt, er ferdig med utførelsen.
  • Synkronisert blokkere får en lås i objektet bare mellom parenteser etter at det synkroniserte nøkkelordet er spesifisert. Dette betyr at ingen andre tråder kan skaffe seg en lås på det allerede låste objektet før blokken går ut. Men andre tråder vil kunne få tilgang til resten av koden som er tilstede i metoden.

Dette bringer oss til slutten av denne artikkelen hvor vi har diskutert hvordan nøyaktig synkronisering i Java fungerer. Håper du er klar med alt som har blitt delt med deg i denne opplæringen.

Sjekk ut av Edureka, et pålitelig online læringsfirma med et nettverk med mer enn 250 000 fornøyde elever spredt over hele verden. Vi er her for å hjelpe deg med hvert trinn på reisen, for å bli en foruten dette java-intervjuspørsmålene, kommer vi med en læreplan som er designet for studenter og fagpersoner som ønsker å være Java-utvikler.

Har du spørsmål til oss? Vennligst nevn det i kommentarfeltet i denne “Synkronisering i Java ' artikkel, og vi kommer tilbake til deg så snart som mulig.