„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Techniken zum Verwalten der Parallelität in Java mithilfe von Semaphoren

Techniken zum Verwalten der Parallelität in Java mithilfe von Semaphoren

Veröffentlicht am 09.11.2024
Durchsuche:230

1. Was ist ein Semaphor in Java?

Techniques for Managing Concurrency in Java Using Semaphores

Ein Semaphor in Java ist eine Synchronisationshilfe, die die Anzahl der Threads einschränkt, die zu einem bestimmten Zeitpunkt auf eine gemeinsam genutzte Ressource zugreifen können. Es ist Teil des Pakets java.util.concurrent und wird zur Verwaltung des gleichzeitigen Zugriffs auf Ressourcen wie Dateien, Datenbanken oder Netzwerkverbindungen verwendet.

1.1 Wie funktioniert ein Semaphor?

Techniques for Managing Concurrency in Java Using Semaphores

Ein Semaphor steuert den Zugriff auf eine festgelegte Anzahl von Genehmigungen. Jede Genehmigung stellt das Recht dar, auf eine bestimmte Ressource zuzugreifen. Das Semaphor verfolgt die Anzahl der verfügbaren Berechtigungen, die bestimmt, wie viele Threads gleichzeitig auf die Ressource zugreifen können.

Permit: Ein Token oder ein Ticket, das es einem Thread ermöglicht, mit dem Zugriff auf eine gemeinsam genutzte Ressource fortzufahren.

Wenn Sie ein Semaphor erstellen, geben Sie die Anzahl der verfügbaren Genehmigungen an. Diese Zahl definiert, wie viele Threads gleichzeitig auf die Ressource zugreifen können.

Bevor ein Thread auf die Ressource zugreifen kann, muss er eine Genehmigung vom Semaphor erhalten. Dies geschieht mit der Methode acquire().

Acquire: Diese Methode wird aufgerufen, wenn ein Thread auf die Ressource zugreifen möchte. Wenn eine Genehmigung verfügbar ist, verringert das Semaphor die Anzahl der verfügbaren Genehmigungen und ermöglicht die Fortsetzung des Threads. Wenn keine Genehmigungen verfügbar sind, wird der Thread blockiert, bis eine Genehmigung verfügbar wird.

Blockierungsverhalten: Wenn keine Genehmigungen verfügbar sind, wird der Thread, der acquire() aufruft, blockiert (d. h. er wartet), bis ein anderer Thread eine Genehmigung freigibt.

Sobald ein Thread die Nutzung der Ressource beendet hat, sollte er die Genehmigung freigeben, um sie für andere Threads verfügbar zu machen. Dies geschieht mit der Methode release().

Release: Diese Methode erhöht die Anzahl der verfügbaren Genehmigungen. Wenn Threads auf eine Genehmigung warten, wird einer von ihnen entsperrt und darf die Genehmigung erhalten.

1.2 Arten von Semaphoren

In Java gibt es zwei Arten von Semaphoren:

  • Zählsemaphor: Dieser Semaphortyp ermöglicht einer festgelegten Anzahl von Threads den Zugriff auf eine Ressource. Wenn Sie beispielsweise das Semaphor auf 3 setzen, können nur drei Threads gleichzeitig auf die Ressource zugreifen.
  • Binäres Semaphor (Mutex): Dies ist ein Sonderfall des Zählsemaphors, bei dem die Anzahl der Berechtigungen eins beträgt, sodass jeweils nur ein Thread auf die Ressource zugreifen kann. Es wird oft als gegenseitige Ausschlusssperre (Mutex) verwendet.

2. Implementierung von Semaphoren in Java

Um besser zu verstehen, wie Semaphoren funktionieren, schauen wir uns eine praktische Implementierung an. Wir erstellen ein einfaches Szenario, in dem mehrere Threads versuchen, auf eine begrenzte Ressource zuzugreifen.

2.1 Einrichten der Umgebung

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    // Creating a semaphore with 3 permits
    private static final Semaphore semaphore = new Semaphore(3);

    public static void main(String[] args) {
        // Creating and starting 6 threads
        for (int i = 1; i 



2.2 Erläuterung des Kodex

In diesem Beispiel erstellen wir ein Semaphor mit drei Berechtigungen, was bedeutet, dass jeweils nur drei Threads auf den kritischen Abschnitt des Codes zugreifen können. Anschließend erstellen wir sechs Threads, die alle versuchen, eine Genehmigung zu erhalten. Sobald ein Thread eine Genehmigung erhält, simuliert er eine Arbeit, indem er zwei Sekunden lang schläft, bevor er die Genehmigung freigibt.

2.3 Beobachten der Ausgabe

Wenn Sie den obigen Code ausführen, sieht die Ausgabe etwa so aus:

Worker 1 is trying to acquire a permit...
Worker 1 acquired a permit.
Worker 2 is trying to acquire a permit...
Worker 2 acquired a permit.
Worker 3 is trying to acquire a permit...
Worker 3 acquired a permit.
Worker 4 is trying to acquire a permit...
Worker 5 is trying to acquire a permit...
Worker 6 is trying to acquire a permit...
Worker 1 is releasing a permit.
Worker 4 acquired a permit.
Worker 2 is releasing a permit.
Worker 5 acquired a permit.
Worker 3 is releasing a permit.
Worker 6 acquired a permit.

Hier erhalten die ersten drei Threads erfolgreich die Genehmigungen und beginnen mit ihren Aufgaben. Die verbleibenden Threads müssen warten, bis eine Genehmigung freigegeben wird, bevor sie fortfahren können.

2.4 Praktische Anwendungsfälle

Semaphoren sind besonders nützlich in Szenarien, in denen Sie die Anzahl gleichzeitiger Zugriffe auf eine bestimmte Ressource begrenzen müssen, wie zum Beispiel:

  • Datenbankverbindungen einschränken
  • Zugriff auf eine freigegebene Datei steuern
  • Netzwerkverbindungen auf einem Server verwalten

3. Vor- und Nachteile der Verwendung von Semaphoren

Obwohl Semaphoren ein leistungsstarkes Werkzeug sind, haben sie ihre eigenen Vor- und Nachteile.

3.1 Vorteile

Flexibilität: Semaphoren ermöglichen eine präzise Kontrolle über den Ressourcenzugriff durch mehrere Threads.

Skalierbarkeit: Semaphore können den Zugriff auf eine große Anzahl von Ressourcen problemlos verwalten.

Fairness: Semaphore können konfiguriert werden, um sicherzustellen, dass Threads Berechtigungen auf faire Weise erhalten.

3.2 Nachteile

Komplexität: Die Verwendung von Semaphoren kann Ihrem Code Komplexität verleihen und das Debuggen erschweren.

Deadlocks: Bei unsachgemäßer Handhabung können Semaphoren zu Deadlocks führen, bei denen Threads auf unbestimmte Zeit blockiert sind und auf Genehmigungen warten.

4. Best Practices für die Verwendung von Semaphoren in Java

Berücksichtigen Sie die folgenden Best Practices, um häufige Fallstricke zu vermeiden und Semaphoren optimal zu nutzen:

4.1 Verwenden Sie tryAcquire für zeitlich begrenzte Akquisitionen

Anstatt „quire()“ zu verwenden, das auf unbestimmte Zeit blockiert, können Sie „tryAcquire()“ verwenden, um zu versuchen, eine Genehmigung mit einer Zeitüberschreitung zu erhalten. Dies verhindert, dass Threads beim Warten hängen bleiben.

if(semaphore.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
    try {
        // Critical section
    } finally {
        semaphore.release();
    }
}

4.2 Geben Sie Genehmigungen immer in einem endgültigen Block frei

Um Ressourcenlecks zu vermeiden, geben Sie die Genehmigung immer in einem finally-Block frei. Dadurch wird sichergestellt, dass die Genehmigung auch im Ausnahmefall freigegeben wird.

4.3 Vermeiden Sie die Verwendung von Semaphoren für einfache Sperren

Wenn Sie eine Ressource nur für einen einzelnen Thread sperren und entsperren müssen, sollten Sie die Verwendung von ReentrantLock oder synchronisiert anstelle eines binären Semaphors in Betracht ziehen.

5. Fazit

Semaphoren sind ein leistungsstarkes Tool zur Verwaltung der Parallelität in Java, mit dem Sie die Anzahl der Threads steuern können, die auf eine gemeinsam genutzte Ressource zugreifen. Indem Sie die in diesem Artikel beschriebenen Techniken und Best Practices befolgen, können Sie Semaphoren effektiv in Ihren Java-Anwendungen implementieren, um eine sichere und effiziente Ressourcenverwaltung zu gewährleisten.

Wenn Sie Fragen haben oder Ihre eigenen Erfahrungen mit Semaphoren teilen möchten, können Sie unten gerne einen Kommentar abgeben!

Weitere Beiträge finden Sie unter: Techniken zur Verwaltung der Parallelität in Java mithilfe von Semaphoren

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/anh_trntun_4732cf3d299/techniques-for-managing-concurrency-in-java-using-semaphores-5ai?1 Bei Verstößen wenden Sie sich zum Löschen bitte an [email protected] Es
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3