Trådsynkronisering
Synkroniserade metoder och block
Synkroniserade metoder och block i Java förhindrar att flera trådar får åtkomst till samma resurs samtidigt. Detta hjälper till att undvika problem som datalopp, där flera trådar försöker ändra en delad resurs samtidigt.
Exempel från verkligheten: Föreställ dig ett lager med en enda ingång och utgång. Om flera personer försöker använda samma dörr samtidigt kan det uppstå kaos. Synkronisering i programmering fungerar som en kontrollant vid dörren, som bara tillåter en person att passera åt gången för att förhindra kollisioner.
Synkroniserade metoder
När en metod deklareras med nyckelordet synchronized låser den automatiskt objektet som metoden tillhör under metodens exekvering.
Kodexempel
Main.java
123public synchronized void increment() { //Adding the synchronized count++; }
I det här exemplet är metoden increment() synkroniserad, vilket innebär att endast en tråd kan köra denna metod vid varje givet tillfälle.
Synkroniserade block
Synkroniserade block gör det möjligt att synkronisera endast en specifik sektion av en metod, vilket är användbart om du bara vill synkronisera en viss del av koden.
Kodexempel
Main.java
12345public void increment() { synchronized(this) { count++; } }
I det här exemplet är endast koden inuti synchronized(this) synkroniserad, vilket förbättrar prestandan om hela metoden inte behöver synkronisering.
I synchronized(this)-blocket betyder nyckelordet this att kodblocket är synkroniserat på den aktuella instansen av objektet, specifikt på det objekt för vilket denna metod anropas.
Objektmonitorer
När en tråd förvärvar en objektmonitor får den exklusiv åtkomst till synkroniserade metoder eller block för det objektet. Andra trådar som försöker komma åt synkroniserade metoder eller block för samma objekt kommer att blockeras tills monitorn släpps.
Metoderna wait(), notify(), notifyAll()
Metoden wait() används för att suspendera exekveringen av den aktuella tråden och frigöra de resurser den upptar tills en annan tråd anropar metoden notify() eller notifyAll() för samma monitorobjekt.
Metoderna notify() och notifyAll() används för att återuppta exekveringen av en eller alla trådar som är blockerade på ett monitorobjekt.
Metoderna wait(), notify() och notifyAll() måste anropas inuti ett synkroniserat block som är kopplat till samma monitorobjekt som den väntande tråden för att säkerställa korrekt synkronisering.
I nästa kapitel kommer vi att undersöka vad som kan inträffa om du inte använder synkronisering.
1. Vad gör nyckelordet synchronized i Java?
2. Hur fungerar objektmonitorn i Java?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Can you explain the difference between synchronized methods and synchronized blocks?
How does the object monitor work in Java synchronization?
What are the roles of wait(), notify(), and notifyAll() methods?
Awesome!
Completion rate improved to 3.33
Trådsynkronisering
Svep för att visa menyn
Synkroniserade metoder och block
Synkroniserade metoder och block i Java förhindrar att flera trådar får åtkomst till samma resurs samtidigt. Detta hjälper till att undvika problem som datalopp, där flera trådar försöker ändra en delad resurs samtidigt.
Exempel från verkligheten: Föreställ dig ett lager med en enda ingång och utgång. Om flera personer försöker använda samma dörr samtidigt kan det uppstå kaos. Synkronisering i programmering fungerar som en kontrollant vid dörren, som bara tillåter en person att passera åt gången för att förhindra kollisioner.
Synkroniserade metoder
När en metod deklareras med nyckelordet synchronized låser den automatiskt objektet som metoden tillhör under metodens exekvering.
Kodexempel
Main.java
123public synchronized void increment() { //Adding the synchronized count++; }
I det här exemplet är metoden increment() synkroniserad, vilket innebär att endast en tråd kan köra denna metod vid varje givet tillfälle.
Synkroniserade block
Synkroniserade block gör det möjligt att synkronisera endast en specifik sektion av en metod, vilket är användbart om du bara vill synkronisera en viss del av koden.
Kodexempel
Main.java
12345public void increment() { synchronized(this) { count++; } }
I det här exemplet är endast koden inuti synchronized(this) synkroniserad, vilket förbättrar prestandan om hela metoden inte behöver synkronisering.
I synchronized(this)-blocket betyder nyckelordet this att kodblocket är synkroniserat på den aktuella instansen av objektet, specifikt på det objekt för vilket denna metod anropas.
Objektmonitorer
När en tråd förvärvar en objektmonitor får den exklusiv åtkomst till synkroniserade metoder eller block för det objektet. Andra trådar som försöker komma åt synkroniserade metoder eller block för samma objekt kommer att blockeras tills monitorn släpps.
Metoderna wait(), notify(), notifyAll()
Metoden wait() används för att suspendera exekveringen av den aktuella tråden och frigöra de resurser den upptar tills en annan tråd anropar metoden notify() eller notifyAll() för samma monitorobjekt.
Metoderna notify() och notifyAll() används för att återuppta exekveringen av en eller alla trådar som är blockerade på ett monitorobjekt.
Metoderna wait(), notify() och notifyAll() måste anropas inuti ett synkroniserat block som är kopplat till samma monitorobjekt som den väntande tråden för att säkerställa korrekt synkronisering.
I nästa kapitel kommer vi att undersöka vad som kan inträffa om du inte använder synkronisering.
1. Vad gör nyckelordet synchronized i Java?
2. Hur fungerar objektmonitorn i Java?
Tack för dina kommentarer!