I Java bruger vi semafore i trådsynkroniseringen. Den bruges til at styre adgangen til en delt ressource, der bruger en tællervariabel. Java tilbyder også en Semaphore-klasse, der indeholder konstruktører og forskellige metoder til at kontrollere adgangen over den delte ressource. Vi vil diskutere den senere i dette afsnit.

Hvor vi går videre i dette afsnit, skal vi først forstå, hvad semafor er, typer af semafor, hvordan den fungerer, og hvordan man implementerer semafor. Når vi har vidst alt om det, vil vi gå videre til Java-semaphor-programmerne.

Hvad er en semafor?

En semafor bruges til at begrænse antallet af tråde, der ønsker at få adgang til en delt ressource. Med andre ord er det en ikke-negativ variabel, der deles mellem trådene, kendt som en tæller. Den sætter grænsen for trådene. En mekanisme, hvor en tråd venter på en semafor, kan signaleres af andre tråde.

  • Hvis tæller > 0, gives der adgang til delte ressourcer.
  • Hvis tæller = 0, nægtes adgang til delte ressourcer.

Kort sagt holder tælleren styr på antallet af tilladelser, den har givet til en delt ressource. Derfor giver semaforen tilladelse til tråde til at dele en ressource.

Kendetegn ved semaforen

Der er følgende kendetegn ved en semafor:

  • Den giver synkronisering mellem trådene.
  • Den mindsker niveauet af synkronisering. Derfor giver den en synkroniseringsmekanisme på lavt niveau.
  • Den semafor indeholder ikke en negativ værdi. Den indeholder en værdi, der enten kan være større end nul eller lig med nul.
  • Vi kan implementere semaforen ved hjælp af testoperationen og interrupts, og vi bruger fildeskriptorer til at udføre den.

Virksomhed af semaforen

Semaphore kontrollerer over den delte ressource gennem en tællervariabel. Tælleren er en ikke-negativ værdi. Den indeholder en værdi, der enten er større end 0 eller lig med 0.

  • Hvis tæller > 0, får tråden tilladelse til at få adgang til den delte ressource, og tællerværdien dekreteres med 1.
  • I modsat fald bliver tråden blokeret, indtil der kan opnås en tilladelse.
  • Når udførelsen af tråden er afsluttet, er der ikke brug for ressourcen, og tråden frigiver den. Når ressourcen frigives, øges tællerværdien med 1.
  • Hvis en anden tråd venter på at erhverve en ressource, vil tråden erhverve en tilladelse på det tidspunkt.
  • Hvis tæller = 0, får tråden ikke tilladelse til at få adgang til den delte ressource.

Lad os forstå semaphorens funktion ved hjælp af et flowdiagram.

Java Semaphore

Typer af semaforer

Der findes fire typer af semaforer, som er som følger:

  • Tællende semaforer
  • Bunded Semaphores
  • Timed Semaphores
  • Binary Semaphores

Java Semaphore

Lad os gennemgå dem en efter en i detaljer.

Tællende semaforer

De tællende semaforer bruges til at løse den situation, hvor mere end én proces ønsker at udføre i den kritiske sektion på samme tid. For at løse dette problem bruger vi derfor tællende semaforer. Se f.eks. følgende kodestump.

Lad os se implementeringen af tællende semaforer.

CountingSemaphoresExample.java

Bounded Semaphores

Vi kan sætte den øvre grænse ved hjælp af bounded semaforer. Den bruges i stedet for de tællende semaforer, fordi de tællende semaforer ikke indeholder nogen øvre grænseværdi. Den øvre grænseværdi angiver, hvor mange signaler den kan lagre. Se f.eks. følgende kodestump.

Lad os se implementeringen af den afgrænsede semafor.

BoundedSemaphoresExample.java

Timed Semaphores

De timede semaforer giver en tråd mulighed for at køre i et bestemt tidsrum. Efter en bestemt tid nulstiller timeren og frigiver alle andre tilladelser.

Lad os se implementeringen af de timede semaforer.

TimedSemaphoresExample.java

Binære semaforer

De binære semaforer er de samme som tællende semaforer. Men husk, at den kun accepterer binære værdier enten 0 eller 1. Dens implementering er let i forhold til andre semaforer. Hvis værdien er 1, er signaloperationen en succes, ellers mislykkes den.

Lad os se implementeringen af binære semaforer.

BinarySemaphoresExample.java

Semaphore i Java

I Java er det et trådsynkroniseringskonstrukt. Konstruktionen bruger en variabel kendt som en tæller, der styrer adgangen over den delte ressource. Det er en type variabel, der bruges til at styre samtidige processer og også synkronisere dem. Den bruges også til at undgå racebetingelser. Det begrænser antallet af tråde til at få adgang til en delt ressource.

For eksempel kan vi begrænse en fil til at få adgang til op til 10 forbindelser samtidigt.

Java Semaphore-klasse

Java tilbyder en Semaphore-klasse til at implementere semaphor-mekanismen. Den hører til pakken java.util.concurrent. Den implementerer grænsefladen Serializable. Derfor er manuel implementering ikke påkrævet.

Semaphoreklassen indeholder følgende to konstruktører:

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

Semaphore(int permits)

Den opretter en semafor og analyserer antallet af tilladelser (det oprindelige antal tilladelser, der er til rådighed) som et argument. Den angiver antallet af tråde, der kan dele en ressource på et tidspunkt. Værdien af permits kan være negativ. I så fald skal der ske en frigivelse, før der vil blive givet nogen erhvervelse.

Syntaks:

Semaphore(int permits, boolean fair)

Den opretter en Semaphore med det angivne antal permits og de angivne fairness-indstillinger.

Syntaks:

Den analyserer to parametre:

  • permits: Værdien af tilladelser kan være negativ. I så fald skal frigivelsen ske, før der gives tilladelse til at erhverve.
  • fair: Hvis vi sætter værdien til true, garanterer semaforen FIFO til trådene i den rækkefølge, de anmodes om, false Som standard giver alle tråde, der venter på ressourcen, tilladelse i en udefineret rækkefølge.

Metoder i semaphor-klassen

Klassen indeholder følgende metoder:

acquire() Metode: Metoden erhverver tilladelser fra semaforen og blokerer, indtil der er en tilgængelig, eller tråden afbrydes. Den reducerer antallet af tilgængelige tilladelser med 1.

Hvis der ikke er nogen tilladelse er tilgængelig for den aktuelle tråd, bliver tråden deaktiveret i forbindelse med trådplanlægningen. Den aktuelle tråd går i inaktiv tilstand, indtil en af to ting sker:

  • Hvis den anden tråd påkalder release()-metoden for at frigive ressourcen, får den aktuelle tråd tilladelser.
  • Hvis den anden tråd afbryder den aktuelle tråd.

Den kaster InterruptedException, hvis den aktuelle tråd bliver afbrudt. Metoden returnerer ikke nogen værdi.

Syntaks:

release() Metode: Den frigiver en tilladelse og returnerer den til semaforen. Den øger antallet af tilgængelige tilladelser med 1. Hvis en tråd forsøger at erhverve en tilladelse, giver semaforen tilladelse til at erhverve den ressource, der netop er blevet frigivet af andre tråde. Endvidere tages den pågældende tråd i betragtning til trådplanlægningsformål.

Syntaks:

availablePermits() Metode: Metoden returnerer antallet af tilladelser, der er tilgængelige i semaforen til tildeling af ressourcen. Normalt bruges den til fejlfinding og testformål.

Syntaks:

Lad os forstå ovenstående metoder gennem et simpelt eksempel.

Brug af semafor som lås

Java giver os mulighed for at bruge en semafor som en lås. Det betyder, at den låser adgangen til ressourcen. Enhver tråd, der ønsker at få adgang til den låste ressource, skal kalde acquire()-metoden, før den får adgang til ressourcen for at erhverve låsen. Tråden skal frigøre låsen ved at kalde release()-metoden, når opgaven er afsluttet. Husk at sætte den øvre grænse til 1. Se f.eks. følgende kodestump:

Lad os se et eksempel på en semafor og bruge semafor som lås.

SemaphoreAsLock.java

Output:

Java Semaphore

Bemærk: Når vi udfører ovenstående program, får vi forskellige output hver gang. Så dit output kan afvige fra det output, der er vist ovenfor.

Java Semaphore Eksempel

Lad os forstå semaphoremekanismen gennem et Java-program. I det følgende eksempel har vi oprettet en konstruktor for Semaphore-klassen med den indledende tilladelsesværdi 3.

SemaphoreExample.java

Output:

Java Semaphore

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.