Heim >Java >javaLernprogramm >Welche Rolle spielt Semaphore bei der Parallelität und dem Multithreading von Java-Funktionen?

Welche Rolle spielt Semaphore bei der Parallelität und dem Multithreading von Java-Funktionen?

WBOY
WBOYOriginal
2024-04-27 12:18:011007Durchsuche

Semaphore ist ein Mechanismus zur Steuerung des Multithread-Ressourcenzugriffs in der gleichzeitigen Java-Programmierung. Er wird durch die Erstellung einer Lizenz implementiert, die die Anzahl der geschützten Ressourcen angibt, auf die ein Thread gleichzeitig zugreifen kann Versucht ein Thread, auf eine Ressource zuzugreifen, versucht er, eine Lizenz zu erhalten. Wenn keine Lizenz verfügbar ist, wird der Thread blockiert, bis eine Lizenz verfügbar ist.

Welche Rolle spielt Semaphore bei der Parallelität und dem Multithreading von Java-Funktionen?

Die Rolle von Semaphore bei der Parallelität von Java-Funktionen und beim Multithreading

Semaphore ist ein wichtiger Mechanismus in der gleichzeitigen Java-Programmierung, der zur Steuerung des Ressourcenzugriffs in Multithread-Szenarien verwendet wird. Dies geschieht durch die Erstellung von Lizenzen für die gemeinsam genutzten Datenstrukturen, die die Ressourcen schützen.

Wie es funktioniert

Semaphore gibt bei der Initialisierung eine Lizenzanzahl an, die die maximale Anzahl von Threads angibt, die gleichzeitig auf geschützte Ressourcen zugreifen können. Wenn ein Thread versucht, auf eine Ressource zuzugreifen, versucht er, eine Lizenz für das Semaphor zu erhalten. Sofern verfügbar, wird die Lizenz gewährt und der Thread kann auf die Ressource zugreifen. Wenn keine Lizenz verfügbar ist, wird der Thread blockiert, bis eine Lizenz verfügbar wird.

Praktischer Fall

Angenommen, wir haben eine gemeinsame Ressource, also eine Warteschlange. Es können nur 5 Threads gleichzeitig auf die Warteschlange zugreifen. Um dies sicherzustellen, können wir ein Semaphor verwenden:

import java.util.concurrent.Semaphore;
import java.util.Queue;

public class Example {
    private static final int MAX_ACCESS_COUNT = 5;
    private static Semaphore semaphore = new Semaphore(MAX_ACCESS_COUNT);
    private static Queue<Integer> queue = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> accessQueue()).start();
        }
    }

    private static void accessQueue() {
        try {
            // 尝试获取一个许可证
            semaphore.acquire();

            // 访问队列
            queue.add((int) (Math.random() * 100));

            // 释放许可证
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

In diesem Beispiel wird das Semaphor mit 5 Lizenzen initialisiert. Dadurch wird sichergestellt, dass nur maximal 5 Threads gleichzeitig auf die Warteschlange zugreifen können. Andere Threads werden blockiert, bis eine Lizenz verfügbar ist.

Fazit

Semaphore ist sehr nützlich bei der Steuerung des gleichzeitigen Zugriffs auf gemeinsam genutzte Ressourcen. Es hilft, Datenwettläufe und Inkonsistenzen zu verhindern, indem die Anzahl der Threads begrenzt wird, die gleichzeitig auf eine Ressource zugreifen können.

Das obige ist der detaillierte Inhalt vonWelche Rolle spielt Semaphore bei der Parallelität und dem Multithreading von Java-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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