Nehmen Sie CountDownLatch als Beispiel, um das CAS-Prinzip kurz zu beschreiben

Zunächst einige grundlegende Codes zu erreichen, die folgende detaillierte Beschreibung des Codes in Verbindung mit dem Video, um noch gründlicher zu lernen, sehr empfehlenswert Mashi Bing Education - IT-Sektor + Predigt Unterricht FAQ .

AtomicInteger.incrementAndGet ();
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
compareAndSwapInt in Unsafe (mehrere Argumente);
Fügen Sie hier eine Bildbeschreibung ein
aus unsafe.cpp unter jdk8u gelernt cmpxchg = Vergleichen und Austauschen

Assemblersprachenreihe is_MP = Multi Processor Bestimmen Sie, ob der Computer über mehrere CPUs verfügt, und fügen Sie gegebenenfalls den Befehl lock cmpxchg hinzu (nichtatomarer Befehl, die zugrunde liegende Implementierung von synchronisiert ).
Fügen Sie hier eine Bildbeschreibung ein
Auf Hardwareebene: Der Sperrbefehl sperrt ein Nordbrückensignal, wenn die nachfolgenden Befehle ausgeführt werden, anstatt die Sperrbusmethode zu verwenden (beachten Sie den Speicherbus in der folgenden Abbildung).
Fügen Sie hier eine Bildbeschreibung ein


Schematische Darstellung der Drehsperre (
Fügen Sie hier eine Bildbeschreibung ein
sperrenfrei ): CountDownLatch ist ein Synchronisationstool für die sich nicht gegenseitig ausschließende Thread-Kommunikation. Es kann zur Koordinierung der Thread-Synchronisation verwendet werden und kann nach der Initialisierung und Verwendung nicht mehr verwendet werden.

Das Arbeitsprinzip von CountDownLatch besteht darin, einen Zähler zu kombinieren, um einen Thread aufzufordern, die Ausführung fortzusetzen, nachdem darauf gewartet wurde, dass andere Threads ihre Arbeit abgeschlossen haben. Der Anfangswert des Zählers ist die Gesamtzahl der Threads. Nachdem jeder Thread seine Aufgabe abgeschlossen hat, wird der Wert des Zählers um eins dekrementiert. Wenn der Wert des Zählers 0 ist, bedeutet dies, dass alle Threads die Thread-Aufgabe abgeschlossen haben und der auf CountDownLatch wartende Thread die Ausführung des nächsten fortsetzen kann Aufgabe.

Nachgedruckte Quelle: Shane Li - Verständnis und Verwendung von CountDownLatch

Thread threads[] = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
for (int i = 0; i < threads.length; i++) {
    threads[i] = new Thread(() -> {
        for (int j = 0; j < 100; j++) {
            m.incrementAndGet(); // m++
        }
        latch.countDown();
    });
}

Arrays.stream(threads).forEach((t) -> t.start());
try {
    latch.await();
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(m);

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/qq_44965393/article/details/113756905
Empfohlen
Rangfolge