Synkronisering i Java: Vad, hur och varför?



Den här artikeln om synkronisering i Java hjälper dig att vägleda dig för att lära dig mer om synkronisering av flertrådiga program.

Program med flera trådar kan regelbundet komma med en omständighet där flera försöka komma till samma resurs som ger bedrägliga och häpnadsväckande resultat. Detta kan lösas med synkronisering i Java. Bara en enda specifik tråd kan komma till resursen vid ett visst syfte. Den här artikeln hjälper dig att bli bekant med synkroniseringsstrategin.

vad kan serieras i Java

Jag kommer att diskutera ämnena i den här ordningen:





Låt oss börja!

Varför använda synkronisering i Java?



Om du börjar med minst två trådar i ett program kan det finnas en chans när flera trådar försöker komma till samma resurs. Det kan till och med skapa ett oväntat resultat på grund av problem med samtidighet.

Syntax :

synkroniserad (objektidentifierare) {// Få tillgång till delade variabler och andra delade resurser}

Till exempel, försök att skriva i en motsvarande fil. Detta kan skada data eftersom en av trådarna kan åsidosätta data eller när en tråd öppnarsamma fil samtidigt kan en annan tråd stänga samma fil.Det finns ett behov av att synkronisera åtgärden för flera trådar. Detta kan implementeras med hjälp av ett koncept som kallas M onitors .



  • Varje är associerad med en bildskärm som en tråd kan låsa eller låsa upp.
  • Endast en tråd åt gången kan hålla ett lås på en bildskärm.
  • Java programmeringsspråk är ett mycket praktiskt sätt att skapa trådar och synkronisera deras uppgift med Synkroniserad block.
  • Det håller också de delade resurserna inom detta specifika block.

Synkroniserade block i Java är markerade med Synkroniserad nyckelord. Detta block i Java synkroniseras på något objekt.Alla block som är synkroniserade på samma objekt kan bara ha en tråd som körs inuti dem åt gången. Alla andra trådar som försöker komma in i det synkroniserade blocket blockeras tills tråden inuti det synkroniserade blocket lämnar blocket.

Typer av synkronisering

Det finns i princip två typer av synkronisering. Dom är:

  1. Processynkronisering: Samtidigt utförande av flera trådar eller processer för att nå ett tillstånd så att de förbinder sig till en viss sekvens av åtgärder.
  2. Trådssynkronisering: Ibland när mer än en trådförsöker komma åt en delad resurs måste du se till att resursen endast används av en tråd påen tid.

Låt oss inte gå in på detaljerna av dessa typer och försöka förstå vad som är inlåsta .

Lås i Java

Som jag nämnde tidigare är synkronisering byggd kring en intern enhet som kallas låsa eller övervaka . Varje objekt har ett lås associerat med sig. Så en tråd som behöver konsekvent åtkomst till ett objekts fält måste skaffa objektets lås innan du får åtkomst till dem och sedan släppa låset när arbetet är klart.

Från Java 5 innehåller paketet java.util.concurrent.locks många låsimplementeringar.

Så här ser ett lås ut:

offentlig klass Lås {privat boolean isLocked = falskt offentligt synkroniserat ogiltigt lås () kastar InterruptedException {medan (isLocked) {wait ()} isLocked = true} offentlig synkroniserad ogiltig upplåsning () {isLocked = falsk meddelande ()}}

Låset () -metoden låser låsinstansen så att alla trådar som anropar lås () blockeras tills upplåsning () körs.

Multitrådning utan synkronisering

Här är ett enkelt exempel som skriver ut räknarvärdet i en sekvens och varje gång vi kör det, ger det ett annat resultat baserat på CPU-tillgänglighet till en tråd. Kolla in det här!

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

Ovanstående program resulterar i detta:

Utgång- Synkronisering i Java- Edureka

Multitrådning med synkronisering

Detta är samma exempel som ovan men det skriver ut räknarvärdet i sekvensen. Varje gång vi kör det ger det samma resultat.

klass Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} fångst (Undantag e) {System. out.println ('Tråd avbruten.')}}} klass Tråd utökar Multitråd {privat Tråd t privat Strängtrådsnamn Multitråd MT Tråd (Strängnamn, Multitråd mt) {trådnamn = namn MT = mt} offentlig ogiltig körning () {synkroniserad ( MT) {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) Tråd T1 = ny tråd (' Tråd - 2 ', MT) T.start () T1.start () // vänta tills trådarna slutar prova {T.join () T1.join ()} fånga (Undantag e) {System.out.println ('Avbruten')}}}

Produktionen visas nedan:

Synkroniserat nyckelord

synkroniserat nyckelord markerar ett block eller en metod som ett kritiskt avsnitt. En kritisk sektion är där endast en tråd körs i taget, och tråden håller låset för den synkroniserade sektionen. Detta synkroniserad nyckelord hjälper till att skriva samverkande delar av alla applikationer. Det skyddar också delade resurser inom blocket.

Det synkroniserade nyckelordet kan användas med:

Låt oss diskutera kodblocket.

Synkroniserat nyckelord: Ett kodblock

Syntax

Den allmänna syntaxen för att skriva ett synkroniserat block är:

synkroniserad (lockObject) {// synkroniserade uttalanden}

När en tråd vill utföra de synkroniserade uttalandena inuti blocket måste den skaffa låset på lockObject's monitor. Endast en tråd kan hämta bildskärmen för ett låsobjekt åt gången. Så alla andra trådar måste vänta tills den nu exekverande tråden förvärvar låset och avslutar dess körning.
På detta sätt synkroniserad nyckelord garanterar att endast en tråd kommer att köra de synkroniserade blockuttalanden åt gången och därmed förhindrar att flera trådar skadar den delade data som finns i blocket.

hur man skapar ett Java-paket

Notera :

  • Om en tråd sätts i vila (med sömn() metod) då släpper det inte låset. Under denna vilotid kommer ingen tråd att köra de synkroniserade blockuttalandena.
  • Java-synkronisering kommer att kasta NullPointerException om låsobjekt används i synkroniserad (lås) ' är inget.

Låt oss nu diskutera metoden.

Synkroniserat nyckelord: En metod

Syntax

Den allmänna syntaxen för att skriva en synkroniserad metod är:

synkroniserad metod (parametrar) {// synkroniserad kod}

Här lockObject är bara en referens till ett objekt vars lås är associerat med monitorn som representerar de synkroniserade uttalandena.

På samma sätt som det synkroniserade blocket måste en tråd få låset på det anslutna monitorobjektet med den synkroniserade metoden. Vid synkroniserad metod är låsobjektet:

  • '.Class' objekt - om den givna metoden är statisk .
  • 'Detta' objekt - om metoden är icke-statisk . ”Detta” är hänvisningen till det aktuella objektet där den synkroniserade metoden åberopas.

Java-synkroniserat nyckelord är återinträde i naturen. Det betyder att om en synkroniserad metod anropar en annan synkroniserad metod som kräver samma lås, kan den aktuella tråden som håller låset gå in i den metoden utan att förvärva låset.

Låt oss gå vidare till det sista ämnet i den här artikeln och peka på de stora skillnaderna mellan det synkroniserade nyckelordet och synkroniseringsblocket.

Skillnad mellan synkroniserat nyckelord och synkroniserat block

  • När du använder synkroniserat nyckelord med en metod , det förvärvar ett lås i objektet för hela metoden. Detta innebär att ingen annan tråd kan använda någon synkroniserad metod förrän den aktuella tråden som anropas har avslutat sin körning.
  • Synkroniserad blockera förvärvar ett lås i objektet endast mellan parenteser efter att det synkroniserade nyckelordet har specificerats. Detta innebär att ingen annan tråd kan få ett lås på det redan låsta objektet tills blocket går ut. Men andra trådar kommer att kunna komma åt resten av koden som finns i metoden.

Detta tar oss till slutet av den här artikeln där vi har diskuterat hur exakt synkronisering i Java fungerar. Hoppas att du är tydlig med allt som har delats med dig i denna handledning.

Kolla in av Edureka, ett pålitligt online-lärande företag med ett nätverk av mer än 250 000 nöjda elever spridda över hela världen. Vi är här för att hjälpa dig med varje steg på din resa, för att bli en förutom de här Java-intervjufrågorna, kommer vi med en läroplan som är utformad för studenter och yrkesverksamma som vill vara Java-utvecklare.

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen i denna “Synkronisering i Java ' artikeln så återkommer vi till dig så snart som möjligt.