Was ist Java Semaphore und Mutex – Java Concurrency MultiThread erklärt mit Beispiel

Veröffentlicht: 2015-03-12

Java Mutex und Semaphore Tutorial von Crunchify

Java Concurrency ist ein sehr weites Thema. Es stehen Hunderte von Tutorials und Beispielen zur Verfügung, die verwendet werden können. Vor einiger Zeit habe ich einige Tutorials zum gleichzeitigen Ausführen mehrerer Threads in Java und zu verschiedenen Arten von synchronisierten Blöcken geschrieben.

In diesem Tutorial werden wir Folgendes durchgehen:

  1. Erklärung von Mutex
  2. Erklärung von Semaphor
  3. Zwei Beispiele mit Details

Lass uns anfangen

Let's keep this in mind folgende Erklärung lesen:

  • Nehmen Sie ein Beispiel für Shopper und Customer
  • Käufer leiht sich Laptops aus
  • Der Kunde kann kommen und den Laptop benutzen – der Kunde benötigt einen Schlüssel, um einen Laptop zu benutzen
  • Nach der Verwendung kann der Kunde den Laptop an Shopper zurückgeben

Was ist Mutex (Nur 1 Thread):

Käufer hat einen Schlüssel zu einem Laptop. Ein Kunde kann sich den Schlüssel – Laptop – zur Zeit ausleihen. Wenn die Aufgabe beendet ist, gibt (befreit) der Käufer den Schlüssel an den nächsten Kunden in der Warteschlange.

Official Definition :

„Mutex wird normalerweise verwendet, um den Zugriff auf einen Abschnitt von re-entrant code zu serialisieren, cannot be executed concurrently werden kann. Ein Mutex-Objekt lässt nur einen Thread in einen kontrollierten Abschnitt zu und zwingt andere Threads, die versuchen, Zugriff auf diesen Abschnitt zu erhalten, zu warten, bis der erste Thread diesen Abschnitt verlassen hat.“

Mit anderen Worten: Mutex = Mutually Exclusive Semaphore

Was ist Semaphore (N angegebene Threads):

Nehmen wir an, Shopper hat jetzt 3 identische Laptops und 3 identische Schlüssel. Semaphore ist die Anzahl der free identical Laptop keys . Der Semaphor-Zähler – die Anzahl der Schlüssel – wird zu Beginn auf 3 gesetzt (alle drei Laptops sind frei), dann wird der Zählwert verringert, wenn der Kunde hereinkommt. Wenn alle Laptops verwendet werden, dh es gibt keine freien Schlüssel mehr für Laptop, die Semaphor-Zählung ist 0. Wenn nun einer der Kunden den Laptop zurückgibt, wird die Semaphore auf 1 erhöht (ein kostenloser Schlüssel) und an den nächsten Kunden in der Warteschlange weitergegeben.

Official Definition : „Ein Semaphor begrenzt die Anzahl gleichzeitiger Benutzer einer gemeinsam genutzten Ressource auf eine maximale Anzahl. Threads können den Zugriff auf die Ressource anfordern (Verringern des Semaphors) und signalisieren, dass sie die Verwendung der Ressource beendet haben (Erhöhen des Semaphors).“

Ein weiteres Muss ist: Lazy Creation of Singleton ThreadSafe Instance

Beispiel-1: (Erklärung unten)

Im obigen Tutorial CrunchifySemaphoreMutexTutorial.java kann der CrunchifyProducer, wenn er threadName zum crunchifyList -Objekt CrunchifyProducer hinzufügt, das Semaphor signalisieren.

Der CrunchifyConsumer kann dann versuchen, das Semaphor zu erwerben, sodass er wartet, bis der CrunchifyProducer signalisiert hat, dass eine Thread-ID hinzugefügt wurde. Beim Signalisieren hinzugefügter Daten wird einer der Verbraucher geweckt und weiß, dass er ein crunchifyList-Objekt lesen kann. Es kann eine Liste lesen und dann wieder versuchen, die Semaphore zu erfassen.

Wenn der Erzeuger in dieser Zeit ein weiteres Paket geschrieben hat, hat er erneut signalisiert und einer der Verbraucher wird dann ein weiteres Paket lesen und so weiter …

Mit anderen Worten:

Ergebnis:

So verhindern Sie Race-Condition:

What if you have multiple Consumers? Im obigen Java-Tutorial sollten die Verbraucher (nicht der Erzeuger) den Puffer sperren, wenn sie das Paket lesen (aber nicht, wenn sie das Semaphor erhalten), um Race-Bedingungen zu verhindern. Im Beispiel unten sperrt der Producer auch die Liste, da sich alles auf derselben JVM befindet.

Beispiel-2:

Ergebnis: