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

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

Nov 01, 2024 am 11:02 AM

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.

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

Beim Erstellen eines Semaphors 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 <= 6; i++) {
            new WorkerThread("Worker " + i).start();
        }
    }

    static class WorkerThread extends Thread {
        private String name;

        WorkerThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            try {
                System.out.println(name + " is trying to acquire a permit...");
                // Acquiring the semaphore
                semaphore.acquire();
                System.out.println(name + " acquired a permit.");

                // Simulating work by sleeping
                Thread.sleep(2000);

                System.out.println(name + " is releasing a permit.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // Releasing the semaphore
                semaphore.release();
            }
        }
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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.
Nach dem Login kopieren

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 in einem Server verwalten

3. Vor- und Nachteile der Verwendung von Semaphoren

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

3.1 Vorteile

Flexibilität: Semaphoren ermöglichen eine präzise Steuerung des Ressourcenzugriffs 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 werden und auf Genehmigungen warten.

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

Um häufige Fallstricke zu vermeiden und Semaphoren optimal zu nutzen, sollten Sie die folgenden Best Practices berücksichtigen:

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.

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 <= 6; i++) {
            new WorkerThread("Worker " + i).start();
        }
    }

    static class WorkerThread extends Thread {
        private String name;

        WorkerThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            try {
                System.out.println(name + " is trying to acquire a permit...");
                // Acquiring the semaphore
                semaphore.acquire();
                System.out.println(name + " acquired a permit.");

                // Simulating work by sleeping
                Thread.sleep(2000);

                System.out.println(name + " is releasing a permit.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // Releasing the semaphore
                semaphore.release();
            }
        }
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

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

Das obige ist der detaillierte Inhalt vonTechniken zum Verwalten der Parallelität in Java mithilfe von Semaphoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1673
14
PHP-Tutorial
1278
29
C#-Tutorial
1257
24
Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? Apr 19, 2025 pm 11:27 PM

Detaillierte Erläuterung des Designs von SKU- und SPU-Tabellen auf E-Commerce-Plattformen In diesem Artikel werden die Datenbankdesignprobleme von SKU und SPU in E-Commerce-Plattformen erörtert, insbesondere wie man mit benutzerdefinierten Verkäufen umgeht ...

Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Apr 19, 2025 pm 11:36 PM

Wie erkennt die Redis -Caching -Lösung die Anforderungen der Produktranking -Liste? Während des Entwicklungsprozesses müssen wir uns häufig mit den Anforderungen der Ranglisten befassen, z. B. das Anzeigen eines ...

See all articles