wake-up-neo.com

Was ist Mutex und Semaphor in Java? Was ist der Hauptunterschied?

Was ist Mutex und Semaphor in Java? Was ist der Hauptunterschied?

104
Tony

Semaphore können gezählt werden, während Mutex nur bis 1 zählen kann.

Angenommen, Sie haben einen Thread ausgeführt, der Clientverbindungen akzeptiert. Dieser Thread kann 10 Clients gleichzeitig behandeln. Dann setzt jeder neue Client das Semaphor, bis es 10 erreicht. Wenn das Semaphor 10 Flags hat, akzeptiert Ihr Thread keine neuen Verbindungen

Mutex werden normalerweise zur Bewachung von Sachen verwendet. Angenommen, Ihre 10 Clients können auf mehrere Teile des Systems zugreifen. Dann können Sie einen Teil des Systems mit einem Mutex schützen. Wenn also ein Client mit diesem Subsystem verbunden ist, sollte kein anderer Benutzer Zugriff haben. Sie können auch ein Semaphor für diesen Zweck verwenden. Ein Mutex ist ein "Gegenseitiger Ausschluss-Semaphor" .

112
Eric

Leider hat jeder den wichtigsten Unterschied zwischen dem Semaphor und dem Mutex übersehen. das Konzept von " Ownership ". 

Semaphore haben keine Ahnung von Eigentum. Dies bedeutet, dass jeder Thread ein Semaphor freigeben kann (dies kann zu vielen Problemen an sich führen, kann jedoch bei der "Todeserkennung" helfen). Während ein Mutex das Konzept des Eigentums besitzt (d. H. Sie können nur einen von Ihnen erworbenen Mutex freigeben).
Das Eigentum ist für die sichere Programmierung gleichzeitiger Systeme enorm wichtig. Ich würde immer empfehlen, Mutex einem Semaphor vorzuziehen (aber es gibt Auswirkungen auf die Leistung). 

Mutexe unterstützen möglicherweise auch die Prioritätsvererbung (die beim Prioritätsinversionsproblem helfen kann) und Rekursion (wodurch ein Deadlock-Typ beseitigt wird). 

Es sollte auch darauf hingewiesen werden, dass es "binäre" Semaphore und "Zählung/allgemeine" Semaphore gibt. Javas Semaphor ist ein Zähl-Semaphor und ermöglicht daher die Initialisierung mit einem Wert größer als Eins (wohingegen ein Mutex, wie bereits erwähnt, nur eine konzeptionelle Anzahl von Eins haben kann). Auf die Nützlichkeit dieser Frage wurde in anderen Beiträgen hingewiesen. 

Zusammenfassend kann ich sagen, es sei denn, Sie haben mehrere Ressourcen, die Sie verwalten müssen. Ich würde den Mutex immer dem Semaphor empfehlen. 

131
feabhas

Mutex ist grundsätzlich gegenseitiger Ausschluss. Nur ein Thread kann die Ressource gleichzeitig erwerben. Wenn ein Thread die Ressource abruft, darf kein anderer Thread die Ressource abrufen, bis der Thread die Ressource freigibt. Alle Threads, die auf den Erwerb der Ressource warten, werden blockiert.

Semaphore wird verwendet, um die Anzahl der ausgeführten Threads zu steuern. Es wird eine feste Anzahl von Ressourcen geben. Die Ressourcenzählung wird jedes Mal verringert, wenn ein Thread dieselbe besitzt. Wenn der Semaphor Count 0 erreicht, dürfen keine anderen Threads die Ressource abrufen. Die Threads werden blockiert, bis andere Threads freigegeben werden.

Kurz gesagt, der Hauptunterschied ist wie viele Threads dürfen die Ressource gleichzeitig erwerben?  

  • Mutex - es ist EINS.
  • Semaphor - DEFINED_COUNT (so viele wie Semaphor zählen)
38
aJ.

Ein Mutex wird für den seriellen Zugriff auf eine Ressource verwendet, während ein Semaphor den Zugriff auf eine Ressource auf eine festgelegte Anzahl beschränkt. Sie können sich einen Mutex als ein Semaphor mit einer Zugriffsanzahl von 1 vorstellen. Unabhängig von der Einstellung Ihrer Semaphor-Anzahl können Threads möglicherweise auf die Ressource zugreifen, bevor die Ressource blockiert wird.

8
Jason Coco

Ein Semaphor ist ein Zähl-Synchronisationsmechanismus, ein Mutex nicht. 

3
Brian Rasmussen

Ein Mutex wird oft als binärer Semaphor bezeichnet. Während ein Semaphor mit einer beliebigen Zahl ungleich Null erstellt werden kann, ist ein Mutex konzeptionell ein Semeaphore mit einer oberen Zählung von 1.

3
Sean

Diese Frage enthält relevante Antworten und Links zu offiziellen Java-Anleitungen: Gibt es einen Mutex in Java?

2
Air

Sie vergleichen das Unvergleichliche, technisch gesehen gibt es keinen Unterschied zwischen einem Semaphor und einem Mutex. Es macht keinen Sinn. Mutex ist nur ein bedeutender Name wie jeder Name in Ihrer Anwendungslogik. Das bedeutet, dass Sie einen Semaphor mit "1" initialisieren. wird normalerweise verwendet, um eine Ressource oder eine geschützte Variable zu schützen, um den gegenseitigen Ausschluss sicherzustellen.

0
Marwen Trabelsi

Semaphor :

Ein Zählsemaphor. Konzeptionell unterhält ein Semaphor eine Reihe von Genehmigungen. Jeder acquire() blockiert bei Bedarf, bis eine Genehmigung verfügbar ist, und übernimmt diese. Jede release() fügt eine Genehmigung hinzu, wodurch möglicherweise ein blockierender Acquirer freigegeben wird. Es werden jedoch keine tatsächlichen Genehmigungsobjekte verwendet. Die Semaphore zählt nur die verfügbare Anzahl und handelt entsprechend.

Semaphore werden häufig verwendet, um die Anzahl der Threads zu beschränken, als auf eine (physische oder logische) Ressource zugegriffen werden kann.

Java verfügt nicht über eine integrierte Mutex-API. Es kann jedoch als binärer Semaphor implementiert werden.

Ein auf eins initialisiertes Semaphor, das so verwendet wird, dass es höchstens eine Genehmigung zur Verfügung hat, kann als gegenseitige Ausschlusssperre dienen. Dies wird häufiger als binäres Semaphor bezeichnet, da es nur zwei Zustände hat: einen zulässigen oder null zulässige. 

Bei dieser Verwendung hat das binäre Semaphor die Eigenschaft (im Gegensatz zu vielen Sperrenimplementierungen), dass das "Sperren" von einem anderen Thread als dem Eigentümer freigegeben werden kann (da Semaphore keine Ahnung von Eigentümer haben). Dies kann in einigen speziellen Kontexten hilfreich sein, beispielsweise bei der Wiederherstellung des Deadlocks.

So Hauptunterschiede zwischen Semaphor und Mutex:

  1. Semaphore beschränken die Anzahl der Threads für den Zugriff auf eine Ressource, sofern dies zulässig ist. Mutex erlaubt nur einem Thread den Zugriff auf die Ressource.

  2. Kein Thread besitzt Semaphore. Threads können die Anzahl der Berechtigungen aktualisieren, indem sie die Methoden acquire() und release() aufrufen. Mutexe sollten nur durch den Faden entriegelt werden, der das Schloss hält.

  3. Wenn ein Mutex mit Bedingungsvariablen verwendet wird, gibt es eine implizite Klammerung - es ist eindeutig welcher Teil des Programms geschützt wird d. Dies ist nicht notwendigerweise der Fall für ein Semaphor, das als go to von Concurrent Programming bezeichnet werden kann - es ist mächtig, aber zu unstrukturiert und zu unbestimmt zu verwenden.

0
Ravindra babu

Mutex ist binärer Semaphor. Es muss mit 1 initialisiert werden, damit das Prinzip "First Come First Serve" erfüllt wird. Dies bringt uns zu den anderen besonderen Eigenschaften jedes Mutex: derjenige, der down getan hat, muss derjenige sein, der uptut. Daher haben wir gegenseitigen Ausschluss über eine Ressource erhalten. 

Nun konnte man sehen, dass ein Mutex ein Sonderfall von allgemeinem Semaphor ist.

0
Kод it

Das Synchronisationsobjekt Semaphore implementiert eine klassische Ampel. Eine Ampel steuert den Zugriff auf eine Ressource, die von einem Zähler gemeinsam genutzt wird. Wenn der Zähler größer als Null ist, wird der Zugriff gewährt. Wenn es Null ist, wird der Zugriff verweigert. Der Zähler zählt die Berechtigungen, die den Zugriff auf die gemeinsam genutzte Ressource ermöglichen. Um auf die Ressource zuzugreifen, muss ein Thread die Erlaubnis der Ampel erhalten. Um eine Ampel zu verwenden, versucht der Thread, der auf die gemeinsam genutzte Ressource zugreifen möchte, im Allgemeinen eine Genehmigung zu erhalten. Wenn die Ampelanzahl größer als Null ist, erhält der Thread eine Genehmigung und die Ampelzählung wird dekrementiert. Andernfalls ist der Thread gesperrt, bis er eine Berechtigung erhält. Wenn der Thread nicht mehr auf die gemeinsam genutzte Ressource zugreifen muss, gibt er die Berechtigung frei, sodass die Anzahl der Ampeln erhöht wird. Wenn ein anderer Thread auf eine Genehmigung wartet, erhält er zu diesem Zeitpunkt eine Genehmigung. Die Semaphore-Klasse von Java implementiert diesen Mechanismus. 

Semaphore hat zwei Builder:

Semaphore(int num)
Semaphore(int num, boolean come)

num gibt die Anfangszählung der Genehmigung an. Dann gibt num die Anzahl der Threads an, die zu einem bestimmten Zeitpunkt auf eine gemeinsam genutzte Ressource zugreifen können. Wenn num eins ist, kann er auf die Ressource einzeln zugreifen. Wenn Sie come auf true setzen, können Sie garantieren, dass die Threads, auf die Sie warten, in der von ihnen gewünschten Reihenfolge die Berechtigung erhalten.

0
Amarildo