In Java, gebruiken we semafoor in de thread synchronisatie. Het wordt gebruikt om de toegang tot een gedeelde bron die een teller variabele gebruikt controleren. Java voorziet ook in een Semafoor klasse die constructors en verschillende methodes bevat om de toegang tot de gedeelde bron te controleren. We zullen het later in deze sectie bespreken.

Voordat we verder gaan in deze sectie, zullen we eerst begrijpen wat semafoor is, soorten semafoor, hoe het werkt, en hoe semafoor te implementeren. Na het kennen van alles over, zullen we overgaan tot de Java semafoor programma’s.

Wat is een semafoor?

Een semafoor wordt gebruikt om het aantal threads die toegang willen tot een gedeelde bron te beperken. Met andere woorden, het is een niet-negatieve variabele die wordt gedeeld door de threads, bekend als een teller. Het stelt de limiet van de threads in. Een mechanisme waarbij een thread wacht op een semafoor kan worden gesignaleerd door andere threads.

  • Als teller > 0, wordt toegang tot gedeelde bronnen verleend.
  • Als teller = 0, wordt toegang tot gedeelde bronnen geweigerd.

In het kort, de teller houdt het aantal toestemmingen bij dat het heeft gegeven aan een gedeelde bron. Daarom, semafoor verleent toestemming aan threads om een bron te delen.

Karakteristieken van semafoor

Er zijn de volgende kenmerken van een semafoor:

  • Het biedt synchronisatie tussen de threads.
  • Het vermindert het niveau van synchronisatie. Het biedt dus een synchronisatiemechanisme op laag niveau.
  • De semafoor bevat geen negatieve waarde. Het houdt een waarde die ofwel groter dan nul of gelijk aan nul kan zijn.
  • We kunnen semafoor implementeren met behulp van de test operatie en interrupts, en we gebruiken de file descriptors voor het uitvoeren ervan.

Werking van semafoor

Semafoor controleert over de gedeelde bron door middel van een teller variabele. De teller is een niet-negatieve waarde. Het bevat een waarde groter dan 0 of gelijk aan 0.

  • Als teller > 0 is, krijgt de thread toestemming om toegang te krijgen tot de gedeelde bron en wordt de tellerwaarde met 1 verminderd.
  • Anders wordt de thread geblokkeerd totdat een toestemming kan worden verkregen.
  • Als de uitvoering van de thread is voltooid, is er geen behoefte meer aan de bron en geeft de thread deze vrij. Na het vrijgeven van de resource wordt de tellerwaarde met 1 verhoogd.
  • Als een andere thread wacht op het verwerven van een resource, zal de thread op dat moment een permissie verwerven.
  • Als teller = 0, krijgt de thread geen permissie om toegang te krijgen tot de gedeelde resource.

Laten we de werking van semafoor begrijpen met behulp van een stroomdiagram.

Java Semafoor

Typen semaforen

Er zijn vier typen semaforen, die als volgt zijn:

  • Tellende semaforen
  • Grensde semaforen
  • Getimede semaforen
  • Binaire semaforen

Java-semafoor

Laten we ze een voor een in detail bespreken.

Tellende semaforen

De tellende semaforen worden gebruikt om de situatie op te lossen waarin meer dan één proces tegelijkertijd wil uitvoeren in de kritieke sectie. Om dit probleem op te lossen gebruiken we tel semafooren. Neem bijvoorbeeld het volgende stukje code.

Laten we eens kijken naar de implementatie van de tellende semaforen.

CountingSemaphoresExample.java

Bounded Semaphores

We kunnen de bovengrens instellen met behulp van de bounded semaforen. Het wordt gebruikt in plaats van de tellende semaforen omdat de tellende semaforen geen bovengrenswaarde bevatten. De bovengrenswaarde geeft aan hoeveel signalen het kan opslaan. Neem bijvoorbeeld het volgende stukje code.

Laten we eens kijken naar de implementatie van de begrensde semafoor.

BoundedSemaphoresExample.java

Timed Semaphores

De getimede semaforen staan een thread toe om gedurende een bepaalde periode te draaien. Na een bepaalde tijd wordt de timer gereset en worden alle andere toestemmingen vrijgegeven.

Laten we de implementatie van de getimede semaforen eens bekijken.

TimedSemaphoresExample.java

Binaire semaforen

De binaire semaforen zijn hetzelfde als tellende semaforen. Maar onthoud dat het alleen binaire waarden accepteert, 0 of 1. De implementatie is eenvoudig in vergelijking met andere semaforen. Als de waarde 1 is, is het signaal operatie succes, mislukt anders.

Laten we eens kijken naar de implementatie van binaire semaforen.

BinarySemaphoresExample.java

Semaphore in Java

In Java, het is een thread synchronisatie construct. De constructie maakt gebruik van een variabele bekend als een teller die de toegang over de gedeelde bron controleert. Het is een type variabele dat wordt gebruikt om gelijktijdige processen te beheren en ze ook te synchroniseren. Het wordt ook gebruikt om “race conditions” te voorkomen. Het beperkt het aantal threads dat toegang heeft tot een gedeelde bron.

Voorbeeld, we kunnen de toegang tot een bestand beperken tot 10 verbindingen tegelijkertijd.

Java Semaphore Class

Java biedt een Semaphore class om het semafoor mechanisme te implementeren. Deze behoort tot het java.util.concurrent pakket. Het implementeert de Serializable interface. Handmatige implementatie is dus niet nodig.

De Semaphore-klasse biedt de volgende twee constructors:

  • Semaphore(int permits)
  • Semaphore(int permits, boolean fair)

Semaphore(int permits)

Het creëert een Semaphore en parsseert het aantal permits (initieel aantal beschikbare permits) als een argument. Het specificeert het aantal threads dat een bron kan delen op een moment. De waarde van permits kan negatief zijn. In dat geval moet een release plaatsvinden voordat een overname wordt toegestaan.

Syntaxis:

Semaphore(int permits, boolean fair)

Het creëert een Semafoor met het gegeven aantal permits en de gegeven fairness-instellingen.

Syntaxis:

Het parst twee parameters:

  • permits: De waarde van permits kan negatief zijn. In dat geval moet de release plaatsvinden voordat er acquires worden toegekend.
  • fair: Als we de waarde op true zetten, garandeert de semafoor FIFO aan de threads in de volgorde waarin ze worden aangevraagd, false By default, alle threads die op de resource wachten, permit in een ongedefinieerde volgorde.

Methods of the Semaphore Class

De klasse biedt de volgende methoden:

acquire() Method: De methode verwerft de permits van de semafoor, blokkerend tot er een beschikbaar is, of de thread wordt onderbroken. Het aantal beschikbare vergunningen wordt met 1 verminderd.

Als er geen vergunning beschikbaar is voor de huidige thread, wordt de thread uitgeschakeld voor de thread scheduling doeleinden. De huidige thread gaat in de inactieve toestand totdat een van de volgende twee dingen gebeurt:

  • Als de andere thread de release() methode aanroept om de resource vrij te geven dan krijgt de huidige thread permits.
  • Als de andere thread de huidige thread onderbreekt.

Het werpt InterruptedException op als de huidige thread wordt onderbroken. De methode retourneert geen waarde.

Syntax:

release() Methode: Hiermee wordt een permissie vrijgegeven en teruggegeven aan de semafoor. Het aantal beschikbare permissies wordt verhoogd met 1. Als een thread een permissies probeert te verkrijgen, geeft de semafoor toestemming om de bron te verkrijgen die zojuist is vrijgegeven door andere threads. Verder wordt die thread in aanmerking genomen voor thread scheduling doeleinden.

Syntax:

beschikbarePermits() Methode: De methode retourneert het aantal beschikbare permits in semafoor voor het toekennen van de resource. Meestal wordt deze methode gebruikt voor debugging- en testdoeleinden.

Syntax:

Laten we de bovenstaande methoden begrijpen aan de hand van een eenvoudig voorbeeld.

Semafoor gebruiken als slot

Java staat ons toe een semafoor te gebruiken als een slot. Het betekent, het vergrendelt de toegang tot de bron. Elke thread die toegang wil tot de vergrendelde bron, moet de acquire() methode aanroepen voordat hij toegang krijgt tot de bron om het slot te verkrijgen. De thread moet het slot vrijgeven door de release() methode aan te roepen, na het voltooien van de taak. Vergeet niet dat de bovengrens op 1 moet worden gezet. Neem bijvoorbeeld het volgende stukje code:

Laten we een voorbeeld van een semafoor bekijken en de semafoor als een slot gebruiken.

SemaphoreAsLock.java

Uitvoer:

Java Semaphore

Note: Wanneer we het bovenstaande programma uitvoeren, krijgen we elke keer een andere uitvoer. Uw uitvoer kan dus afwijken van de hierboven getoonde uitvoer.

Java Semaphore Voorbeeld

Laten we het semafoormechanisme eens begrijpen aan de hand van een Java-programma. In het volgende voorbeeld hebben we een constructor van de klasse Semaphore gemaakt met de initiële toestemmingswaarde 3.

SemaphoreExample.java

Uitvoer:

Java Semaphore

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.