I Java använder vi Semaphore i trådsynkroniseringen. Den används för att kontrollera åtkomsten till en delad resurs som använder en motvariabel. Java tillhandahåller också en Semaphore-klass som innehåller konstruktörer och olika metoder för att kontrollera åtkomst över den delade resursen. Vi kommer att diskutera den senare i det här avsnittet.
För att gå vidare i det här avsnittet ska vi först förstå vad semafor är, typer av semafor, hur den fungerar och hur man implementerar semafor. Efter att ha vetat allt om det kommer vi att gå vidare till Javas semaforprogram.
- Vad är en semafor?
- Kännetecken för semafor
- Semaforens funktion
- Typer av semaforer
- Räknande semaforer
- Bounded Semaphores
- Timed Semaphores
- Binära semaforer
- Semaphore in Java
- Java Semaphore Class
- Semaphore(int permits)
- Semaphore(int permits, boolean fair)
- Metoder för semaforklassen
- Användning av semafor som lås
- Notera: När vi utför ovanstående program får vi olika output varje gång. Så din utdata kan skilja sig från den som visas ovan.
- Java Semaphore Example
Vad är en semafor?
En semafor används för att begränsa antalet trådar som vill få tillgång till en delad resurs. Med andra ord är det en icke-negativ variabel som delas mellan trådarna som kallas för en räknare. Den fastställer gränsen för trådarna. En mekanism där en tråd väntar på en semafor kan signaleras av andra trådar.
- Om counter > 0 ges tillgång till delade resurser.
- Om counter = 0 nekas tillgång till delade resurser.
Som kort sagt, counter håller koll på antalet behörigheter som den har gett till en delad resurs. Därför ger semaforen tillstånd till trådar att dela en resurs.
Kännetecken för semafor
Det finns följande kännetecken för en semafor:
- Den ger synkronisering mellan trådarna.
- Den minskar graden av synkronisering. Ger därför en synkroniseringsmekanism på låg nivå.
- Semaforen innehåller inget negativt värde. Den innehåller ett värde som antingen kan vara större än noll eller lika med noll.
- Vi kan implementera semaforen med hjälp av testoperation och avbrott, och vi använder fildeskriptorer för att exekvera den.
Semaforens funktion
Semaforen kontrollerar den delade resursen genom en räknarvariabel. Räknaren är ett icke-negativt värde. Den innehåller ett värde som antingen är större än 0 eller lika med 0.
- Om räknaren > 0 får tråden tillstånd att få tillgång till den delade resursen och räknarvärdet dekrementeras med 1.
- I annat fall blockeras tråden tills ett tillstånd kan erhållas.
- När trådens exekvering är avslutad finns det inget behov av resursen och tråden släpper den. Efter frisläppandet av resursen ökas räknarvärdet med 1.
- Om en annan tråd väntar på att förvärva en resurs kommer tråden att förvärva ett tillstånd vid den tidpunkten.
- Om räknaren = 0 får tråden inte tillstånd att få tillgång till den delade resursen.
Låta oss förstå hur semaforen fungerar med hjälp av ett flödesschema.
Typer av semaforer
Det finns fyra typer av semaforer, vilka är följande:
- Räknande semaforer
- Bundna semaforer
- Timade semaforer
- Binära semaforer
Låt oss diskutera dem en och en i detalj.
Räknande semaforer
Räknande semaforer används för att lösa situationer där mer än en process vill utföra en kritisk sektion samtidigt. För att lösa detta problem använder vi därför räkne-semaforerna. Tänk till exempel på följande kodutdrag.
Låt oss se implementeringen av de räknande semaforerna.
CountingSemaphoresExample.java
Bounded Semaphores
Vi kan ställa in den övre gränsen med hjälp av de bundna semaforerna. Den används i stället för räkne-semaphorerna eftersom räkne-semaphorerna inte innehåller något övre gränsvärde. Det övre gränsvärdet anger hur många signaler den kan lagra. Tänk till exempel på följande kodutdrag:
Låt oss se implementeringen av den avgränsade semaforen.
BoundedSemaphoresExample.java
Timed Semaphores
De timade semaforerna gör det möjligt för en tråd att köras under en bestämd tidsperiod. Efter en viss tid återställs timern och släpper alla andra tillstånd.
Låt oss se implementeringen av de tidsstyrda semaforerna.
TimedSemaphoresExample.java
Binära semaforer
Den binära semaforen är samma sak som räkne-semaforer. Men kom ihåg att den endast accepterar binära värden, antingen 0 eller 1. Dess implementering är enkel i jämförelse med andra semaforer. Om värdet är 1 är signaloperationen framgångsrik, annars misslyckas den.
Låt oss se implementeringen av binära semaforer.
BinarySemaphoresExample.java
Semaphore in Java
I Java är det en trådsynkroniseringskonstruktion. Konstruktionen använder en variabel som kallas för en räknare som kontrollerar åtkomsten över den delade resursen. Det är en typ av variabel som används för att hantera samtidiga processer och även synkronisera dem. Den används också för att undvika kapplöpningstillstånd. Den begränsar antalet trådar som får tillgång till en delad resurs.
Till exempel kan vi begränsa en fil till att få tillgång till upp till 10 anslutningar samtidigt.
Java Semaphore Class
Java tillhandahåller en Semaphore-klass för att implementera semaformekanismen. Den tillhör paketet java.util.concurrent. Den implementerar gränssnittet Serializable. Därför krävs ingen manuell implementering.
Semaforeklassen tillhandahåller följande två konstruktörer:
- Semaphore(int permits)
- Semaphore(int permits, boolean fair)
Semaphore(int permits)
Den skapar en semaforekonstruktör och pararserar antalet permits (initialt antal tillgängliga permits) som ett argument. Den anger antalet trådar som kan dela en resurs vid ett tillfälle. Värdet för permits kan vara negativt. I ett sådant fall måste en frigörelse ske innan några förvärv beviljas.
Syntax:
Semaphore(int permits, boolean fair)
Det skapar en Semafore med det givna antalet permits och de givna inställningarna för fairness.
Syntax:
Det parserar två parametrar:
- permits: Värdet på permits kan vara negativt. I ett sådant fall måste frisläppandet ske innan några förvärv beviljas.
- fair: Om vi ställer in värdet till true garanterar semaforen FIFO till trådarna i den ordning de begärs, false Som standard beviljas alla trådar som väntar på resursen permit i en odefinierad ordning.
Metoder för semaforklassen
Klassen tillhandahåller följande metoder:
acquire() Metod: Metod: För att få en resurs som är tillgänglig för alla trådar, måste den vara tillgänglig för alla trådar: Metoden förvärvar behörigheter från semaforen och blockerar tills en sådan finns tillgänglig eller tills tråden avbryts. Den minskar antalet tillgängliga tillstånd med 1.
Om det inte finns något tillstånd tillgängligt för den aktuella tråden blir tråden inaktiverad för trådplanering. Den aktuella tråden blir inaktiv tills en av två saker händer:
- Om den andra tråden åberopar metoden release() för att frigöra resursen får den aktuella tråden tillstånd.
- Om den andra tråden avbryter den aktuella tråden.
Den kastar InterruptedException om den aktuella tråden avbryts. Metoden returnerar inget värde.
Syntax:
release() Metod: Den frigör ett tillstånd och returnerar det till semaforen. Den ökar antalet tillgängliga tillstånd med 1. Om en tråd försöker förvärva ett tillstånd ger semaforen tillstånd att förvärva den resurs som just frigjorts av andra trådar. Vidare beaktas den tråden för trådplanering.
Syntax:
availablePermits() Metod: Metoden returnerar antalet tillgängliga tillstånd i semaforen för att bevilja resursen. Vanligtvis används den för felsökning och testning.
Syntax:
Låt oss förstå ovanstående metoder genom ett enkelt exempel.
Användning av semafor som lås
Java tillåter oss att använda en semafor som lås. Det innebär att den låser åtkomsten till resursen. Varje tråd som vill få tillgång till den låsta resursen måste anropa acquire()-metoden innan den får tillgång till resursen för att förvärva låset. Tråden måste frigöra låset genom att anropa metoden release() när uppgiften är slutförd. Kom ihåg att sätta den övre gränsen till 1. Tänk till exempel på följande kodutdrag:
Låt oss se ett exempel på en semafor och använda semafor som lås.
SemaphoreAsLock.java
Output:
Notera: När vi utför ovanstående program får vi olika output varje gång. Så din utdata kan skilja sig från den som visas ovan.
Java Semaphore Example
Låt oss förstå semaformekanismen med hjälp av ett Javaprogram. I följande exempel har vi skapat en konstruktör av Semaphore-klassen med det initiala permissionsvärdet 3.
SemaphoreExample.java
Output: