Heim Java javaLernprogramm Codeanalyse des flüchtigen Java-Schlüsselworts

Codeanalyse des flüchtigen Java-Schlüsselworts

Oct 22, 2018 pm 02:43 PM
java multiprocessing thread 多线程

Der Inhalt dieses Artikels befasst sich mit der Codeanalyse des flüchtigen Java-Schlüsselworts. Ich hoffe, dass er für Freunde hilfreich ist.

Ich glaube, die meisten Java-Programmierer haben gelernt, wie man das Schlüsselwort volatile verwendet. Die Definition von volatile in der Baidu-Enzyklopädie:

Volatile ist ein Typspezifizierer, der dazu dient, Variablen zu ändern, auf die verschiedene Threads zugreifen und die sie ändern. volatile fungiert als Anweisungsschlüsselwort, um sicherzustellen, dass diese Anweisung aufgrund der Compileroptimierung nicht weggelassen wird und jedes Mal ein direktes Lesen des Werts erfordert.

Vielleicht gibt es viele Freunde, die gerade erst Java gelernt haben und nach dem Lesen der sehr allgemeinen Beschreibung oben immer noch verwirrt sind.

Lassen Sie uns anhand eines konkreten Beispiels lernen, wie man volatile verwendet.

Sehen Sie sich dieses Beispiel an:

public class ThreadVerify {
    public static Boolean stop = false;
    public static void main(String args[]) throws InterruptedException {
        Thread testThread = new Thread(){
            @Override
            public void run(){
                int i = 1;
                while(!stop){
                    //System.out.println("in thread: " + Thread.currentThread() + " i: " + i);
                    i++;
                }
                System.out.println("Thread stop i="+ i);
            }
        }
        ;
        testThread.start();
        Thread.sleep(1000);
        stop = true;
        System.out.println("now, in main thread stop is: " + stop);
        testThread.join();
    }
}
Nach dem Login kopieren

Dieser Code definiert einen booleschen Variablenstopp in der zweiten Zeile des Hauptthreads, und dann startet der Hauptthread einen neuen Thread und erhöht den Zähler im Der Wert von i beendet die Schleife erst, wenn die boolesche Variable stop des Hauptthreads vom Hauptthread auf true gesetzt wird.

Der Hauptthread pausiert für 1 Sekunde mit Thread.sleep und setzt den booleschen Wert stop auf true.

Codeanalyse des flüchtigen Java-Schlüsselworts

Daher erwarten wir, dass der obige Java-Code nach 1 Sekunde Ausführung stoppt und den tatsächlichen Wert des Zählers i ausgibt 1-Sekunden-Wert.

Nach der Ausführung dieser Java-Anwendung stellen Sie jedoch fest, dass sie in eine Endlosschleife gerät. Im Task-Manager stellen Sie fest, dass die CPU-Auslastung dieses Java-Programms stark ansteigt.

Was ist der Grund? Lassen Sie uns die im Computer-Hauptkurs „Betriebssysteme“ vermittelten Kenntnisse über Speichermodelle noch einmal Revue passieren lassen.

Nehmen Sie als Beispiel das Java-Speichermodell. Das Java-Speichermodell ist in Hauptspeicher und Arbeitsspeicher unterteilt. Die Variablen im Hauptspeicher werden von allen Threads gemeinsam genutzt. Jeder Thread verfügt über einen eigenen Arbeitsspeicher, und die darin enthaltenen Variablen umfassen Thread-lokale Variablen. Wenn eine Variable im Hauptspeicher von einem Thread verwendet wird, behält der Arbeitsspeicher des Threads eine Kopie der Hauptspeichervariablen bei.

Codeanalyse des flüchtigen Java-Schlüsselworts

Alle Lese- und Schreibvorgänge von Variablen durch Threads müssen im Arbeitsspeicher ausgeführt werden, und Variablen im Hauptspeicher können nicht direkt manipuliert werden. Verschiedene Threads können nicht direkt auf den Arbeitsspeicher des anderen zugreifen. Die Übertragung von Variablen zwischen Threads muss über den Hauptspeicher erfolgen. Die interaktive Beziehung zwischen Threads, Hauptspeicher und Arbeitsspeicher ist wie folgt:

Codeanalyse des flüchtigen Java-Schlüsselworts

Wenn der Thread die Definition in seinem eigenen Ausführungscode ändert, Variablen im Hauptthread (Hauptspeicher) werden direkt im Arbeitsspeicher des Threads geändert und dann zu einem bestimmten Zeitpunkt (der Java-Programmierer kann diesen Zeitpunkt nicht steuern, sondern wird von der JVM geplant) diese Änderung aus dem Arbeitsspeicher zurückgeschrieben. Arbeitsspeicher.

Zurück zu unserem Beispiel. Obwohl der Hauptthread die Stoppvariable ändert, ändert er nur den Wert im Hauptspeicher, während die Stoppvariable im Arbeitsspeicher des Threads, der den Zähler betreibt, immer noch den alten Wert hat, der immer falsch ist. Deshalb steckt dieser Thread in einer Endlosschleife fest.

Codeanalyse des flüchtigen Java-Schlüsselworts

Sobald Sie das Prinzip kennen, ist die Lösung einfach. Fügen Sie das Schlüsselwort volatile vor der Stoppvariablen hinzu, um es zu ändern, sodass Volatile den Thread jedes Mal, wenn der Stoppwert im Zählerthread gelesen wird, dazu zwingt, aus dem Hauptspeicher zu lesen, anstatt aus dem Arbeitsspeicher des aktuellen Threads zu lesen. Dadurch wird eine Endlosschleife vermieden. Das Bild unten zeigt, dass der Zähler nach 1 Sekunde 1,4 Milliarden Mal ausgeführt wurde.

Codeanalyse des flüchtigen Java-Schlüsselworts

Das obige ist der detaillierte Inhalt vonCodeanalyse des flüchtigen Java-Schlüsselworts. 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ß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)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

See all articles