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 ();
compareAndSwapInt in Unsafe (mehrere Argumente);
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 ).
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).
Schematische Darstellung der Drehsperre (
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);