Denne oppskrivningen vil utforske de forskjellige aspektene ved synkronisering i Java, og i denne forbindelse vil denne artikkelen dekke følgende konsepter:
Så la oss få
Hva er synkronisering i Java?
Det er en prosess som kontrollerer tilgangen til mer enn en tråd til en hvilken som helst delt ressurs, og unngår derfor inkonsekvente resultater.
Hvorfor brukes synkronisering?
I Java er hovedformålet med å bruke synkronisering å unngå inkonsekvent oppførsel av tråder og å forhindre interferens for tråder.
Hvorfor synkronisert nøkkelord brukes i Java
Synkronisert er en modifiserer som bare kan brukes på metodene og blokker og kan ikke brukes på variabler og klasser. For å forstå dette konseptet
Hvordan bruke synkronisering i Java
Vi vil vurdere noen eksempler for en dyp forståelse. Til å begynne med vil vi lage et veldig enkelt Java -program for å øke verdien av telleren. Deretter vil vi utvide dette eksemplet til det multithreaded -scenariet. Etter hvert vil vi ta turen mot synkroniseringen der vi vil lære hvorfor det synkroniserte nøkkelordet brukes i Java?
Eksempel
I dette eksemplet vil vi lage et enkelt program som har en variabel disk og en brukerdefinert funksjon inkrementValue ().
Hver gang vi påkaller inkrementValue () det vil øke verdien av disk av 1:
Verdien av telleren økes vellykket til 1 som viser hensiktsmessigheten av programmet vårt. Hvis vi kaller inkrementValue () metode to ganger, da vil verdien av telleren 2. Tilsvarende vil det vise verdien av teller som 3 hvis vi kaller inkrementValue () Metode tre ganger som vist i utdraget nedenfor:
I ovennevnte kodebit påkalte vi inkrementValue () metode fire ganger, så den viser verdien av teller som 4.
Eksempel
La oss nå utvide eksemplet ovenfor litt der vi lager en tråd som vil kalle inkrementValue () ti ganger:
I ovennevnte kodesnippet-sammenføyning () brukes metoden med gjenstand for trådklasse slik at den ene tråden skal vente til den andre tråden fullfører utførelsen. Ovennevnte kode-snippet produserer følgende utdata:
Fra utgangen er det klart at tråden kaller inkrementValue () ti ganger og dermed er verdien av telleren lik ti.
Så langt så bra, la oss nå vurdere et flertrådet miljø og lage en tråd til for å se hva som vil skje når to tråder krever samme ressurs (i.e. inkrementValue () metode) samtidig.
Eksempel
I dette eksemplet har vi to tråder som begge vil kalle inkrementValue () -metoden fem hundre ganger:
klasse motklasseSiden begge trådene kaller motverdien () fem hundre ganger, bør teknisk sett verdien av økning være tusen. La oss vurdere utdraget nedenfor for å se hva som sier output:
I stedet for “1000”, får vi “753”, hva betyr det nå? Hvorfor fikk vi ikke tellerens verdi som 1000?
Vel, det er fordi multithreading støtter parallell prosessering, og det er derfor alltid en mulighet for at begge trådene henter verdien av telleren samtidig og at begge får samme verdi av teller, i et slikt tilfelle i stedet for å øke den verdien av teller to ganger, det øker bare en gang.
Så hvordan du kan unngå et slikt scenario? Vi vil! I slike tilfeller vil det synkroniserte søkeordet bli brukt.
Eksempel
Vi vil bruke det synkroniserte nøkkelordet med "inkrementValue ()”Metode som et resultat bare en tråd vil få tilgang til“inkrementValue ()”Metode på en gang. All koden vil forbli den samme som i forrige eksempel bare synkronisert søkeord vil bli lagt til med inkrementValue () -metoden som vist i utdraget:
Nå hvis tråd 1 jobber med inkrementValue () metode vil tråd 2 vente, og omvendt. Denne gangen får vi følgende utdata:
Ovennevnte utdrag viser effektiviteten til det "synkroniserte" nøkkelordet.
Konklusjon
Synkronisering er en prosess som kontrollerer tilgangen til mer enn en tråd og sørger for/verifiserer at bare en tråd kan få tilgang til ressursen på et bestemt tidspunkt. For å oppnå synkronisering brukes det synkroniserte nøkkelordet/modifikatoren, og det kan brukes på metodene og blokker, men kan ikke brukes på variabler og klasser. I Java er hovedformålet med å bruke synkronisering å unngå inkonsekvent oppførsel av tråder og å forhindre interferens for tråder.