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?

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.

Java Semaphore

Typer av semaforer

Det finns fyra typer av semaforer, vilka är följande:

  • Räknande semaforer
  • Bundna semaforer
  • Timade semaforer
  • Binära semaforer

Java 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:

Java Semaphore

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:

Java Semaphore

Lämna ett svar

Din e-postadress kommer inte publiceras.