Was ist Semaphor in Java und seine Verwendung?



Ein Semaphor dient zur Synchronisation von Prozessen. Dieser Blog führt Sie durch die verschiedenen Arten und Implementierungen von Semaphoren in Java.

Ein Semaphor in Steuert den Zugriff auf eine gemeinsam genutzte Ressource über einen Zähler. Es ist ein Thread-Synchronisation Konstrukt zum Senden von Signalen zwischen Threads, um verpasste Signale zu vermeiden oder einen kritischen Abschnitt zu schützen. In diesem Blog über Semaphoren in Java werden wir das Konzept im Detail verstehen.
Die folgenden Themen werden in diesem Blog behandelt:

Was ist Semaphor in Java?

Ein Semaphor ist eine Variable, die zur Synchronisation von Prozessen verwendet wird und zur Verwaltung gleichzeitiger Prozesse verwendet wird. Es wird auch verwendet, um den Zugriff auf eine gemeinsame Ressource durch mehrere gleichzeitige Prozesse zu steuern und eine Racebedingung zu vermeiden.





Arten von Semaphoren -

  • Binäres Semaphor: Ein binäres Semaphor nimmt nur 0 und 1 als Werte an und wird verwendet, um den gegenseitigen Ausschluss zu implementieren und gleichzeitige Prozesse zu synchronisieren.

  • Semaphor zählen: Der Wert eines Zählsemaphors an einem beliebigen Punkt gibt die maximale Anzahl von Prozessen an, die genau zur gleichen Zeit in den kritischen Abschnitt eintreten können.



    Implementierung der Prioritätswarteschlange in Java

Arbeiten von Semaphore

  • Wenn die Semaphoranzahl> 0 ist, erhält der Thread eine Genehmigung, wodurch die Anzahl der Semaphore verringert wird.

  • Sonst die wird gesperrt, bis eine Genehmigung erworben werden kann.

  • Wenn der Thread keinen Zugriff mehr auf eine gemeinsam genutzte Ressource benötigt, gibt er die Genehmigung frei und erhöht die Anzahl der Semaphore.



    So erstellen Sie eine Warnung in Javascript
  • Wenn ein anderer Thread auf eine Genehmigung wartet, erhält dieser Thread zu diesem Zeitpunkt eine Genehmigung.

Implementierung von Semaphore

import java.util.concurrent. * // Nimmt Resource als gemeinsam genutzte Klassenklasse Resource {static int count = 0} Klasse MyDemo erweitert Demo {Semaphor sem String threadName public MyDemo (Semaphor sem, String threadName) {super (threadName) this. sem = sem this.threadName = threadName} @Override public void run () {// Nach X ausführen if (this.getName (). entspricht ('X')) {System.out.println ('Starting' + threadName) try {// Erhält die Erlaubnis zum Zugriff auf die gemeinsam genutzte Ressource System.out.println (threadName + 'wartet auf eine Erlaubnis.') // Erlangung der Sperre sem.acquire () System.out.println (threadName + 'erhält eine Erlaubnis . ') // Nun wartet der Zugriff auf die gemeinsam genutzte Ressource und den Rest auf (int i = 0 i<7 i++) { Resource.count++ System.out.println(threadName + ': ' + Resouce.count) // Now thread Y will try to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } // run by thread Y else { System.out.println('Starting ' + threadName) try { // First, Y will try to get permit System.out.println(threadName + ' waiting for a permit.') // acquiring the lock sem.acquire() System.out.println(threadName + ' gets a permit.') // Now, accessing the shared resource and others will wait for(int i=0 i < 7 i++) { Resource.count-- System.out.println(threadName + ': ' + Resource.count) // Now, allowing a context switch -- if possible. // for thread X to execute Thread.sleep(20) } } catch (InterruptedException exc) { System.out.println(exc) } // Release the permit. System.out.println(threadName + ' releases the permit.') sem.release() } } } public class SemTest { public static void main(String args[]) throws InterruptedException { // creating a Semaphore object // with number of permits 1 Semaphore sem = new Semaphore(1) // creating two threads with name X and Y // Here thread X will increment and Y will decrement the counter MyDemo md1 = new MyDemo(sem, 'X') MyDemo md2 = new MyDemo(sem, 'Y') // stating threads X and Y md1.start() md2.start() // waiting for threads X and Y md1.join() mtd.join() System.out.println('count: ' + Resource.count) } } 

Ausgabe-
X starten
Starten von Y.
X wartet auf eine Erlaubnis
Sie warten auf eine Erlaubnis
X: 1
X: 2
X: 3
X: 4
X: 5
X: 6
X: 7
X gibt die Genehmigung frei
Y bekommt die Erlaubnis
Y: 6
Y: 5
Y: 4
Y: 3
Y: 2
Y: 1
Y: 0
Und Veröffentlichungen erlauben
Anzahl: 0

Damit sind wir am Ende dieses Blogs über „Semaphoren in Java“ angelangt. Wenn Sie mehr über Java erfahren möchten, lesen Sie die von Edureka, einem vertrauenswürdigen Online-Lernunternehmen mit einem Netzwerk von mehr als 250.000 zufriedenen Lernenden auf der ganzen Welt. Der Java J2EE- und SOA-Schulungs- und Zertifizierungskurs von Edureka richtet sich an Studenten und Fachleute, die Java-Entwickler werden möchten. Der Kurs soll Ihnen einen Vorsprung in die Java-Programmierung verschaffen und Sie sowohl für grundlegende als auch für fortgeschrittene Java-Konzepte sowie für verschiedene Java-Frameworks wie Hibernate & Spring schulen.

Hast du eine Frage an uns? Bitte erwähnen Sie es im Kommentarbereich dieses Blogs „Was ist Semaphor in Java?“ Und wir werden uns so schnell wie möglich bei Ihnen melden.