public class Semaphore
extends java.lang.Object
Diese Klasse implementiert ein Semaphor, das zur Synchronisation von Threads verwendet werden kann.
Modifier and Type | Field and Description |
---|---|
private int |
_permits
Diese Variable gibt an, wie oft eine Sperre geholt werden darf (wie oft ein kritischer Abschnitt betreten werden kann).
|
private int |
_upperBoundPermit
Wie viele Threads dürfen maximal in den kritischen Abschnitt.
|
Constructor and Description |
---|
Semaphore(int permits)
Einen Semaphor erzeugen, der
permit viele acquire Zugriffe zuläßt, bis er jeden weiteren Thread, der acquire aufruft, mit wait “schlafen” legt. |
Modifier and Type | Method and Description |
---|---|
void |
acquire()
Eine Sperre des Semaphores anfordern, sind keine Sperren mehr zu vergeben, dann wird der Thread mit wait() angehalten.
|
void |
release()
Eine Sperre des Semaphores freigeben, dies befreit andere Threads, die auf eine Sperre warten.
|
void |
setUpperBoundPermit(int upperBoundPermit)
Diese Methode setzt die Anzahl der Sperren neu.
|
private int _permits
Diese Variable gibt an, wie oft eine Sperre geholt werden darf (wie oft ein kritischer Abschnitt betreten werden kann). Ist die untere Grenze (0) erreicht legt jeder Thread sich automatsich schlafen(wait), der versucht auf dieses Objekt ein acquire
auszuführen.
private int _upperBoundPermit
Wie viele Threads dürfen maximal in den kritischen Abschnitt. Diese Variable verhindert, dass das die Variable _permits beliebig mit release
erhöht werden kann. Diese Variable kann mit set-Methode erhöht werden.
public Semaphore(int permits)
Einen Semaphor erzeugen, der permit
viele acquire
Zugriffe zuläßt, bis er jeden weiteren Thread, der acquire
aufruft, mit wait “schlafen” legt.
permits
- Wie viele Threads dürfen in den kritischen Abschnittpublic void acquire()
Eine Sperre des Semaphores anfordern, sind keine Sperren mehr zu vergeben, dann wird der Thread mit wait() angehalten. Ein anderer Thread, der seine Sperre wieder aufgibt, kann den wartenden Thread wieder befreien.
public void release()
Eine Sperre des Semaphores freigeben, dies befreit andere Threads, die auf eine Sperre warten.
public void setUpperBoundPermit(int upperBoundPermit)
Diese Methode setzt die Anzahl der Sperren neu. Es ist somit zur Laufzeit möglich, dem Semaphor neue Sperren zu geben (entweder Sperren entziehen oder neue Sperren freischalten). Gibt es neue Sperren, dann werden sofort alle Threads, die warten, mit notifyAll darauf hingewiesen.
TBD Dies ist keine “normale” Funktion, die auf Semaphoren angewandt wird. Ist diese Methode hier in Ordnung ?
upperBoundPermit
- Neue Obergrenze, soviele Sperren stehen nun zur Verfügung