Inhaltsverzeichnis
Synchronisierte Methoden verwenden
Verwenden Sie synchronisierte Anweisungen oder Blöcke
Was ist Synchronisation?
Warum müssen wir synchronisieren?
Zusammenfassung
Heim Java javaLernprogramm Ein Beispiel, um zu verstehen, wie das synchronisierte Schlüsselwort in Java verwendet wird

Ein Beispiel, um zu verstehen, wie das synchronisierte Schlüsselwort in Java verwendet wird

Oct 08, 2022 pm 04:02 PM
java

Dieser Artikel vermittelt Ihnen relevantes Wissen über Java und stellt hauptsächlich verwandte Themen zum synchronisierten Schlüsselwort vor, einschließlich der Verwendung von Synchronisationsmethoden, der Verwendung von Synchronisationsanweisungen oder -blöcken, was Synchronisation ist und warum Synchronisation erforderlich ist Schauen Sie sich den Inhalt unten an. Ich hoffe, er wird für alle hilfreich sein.

Empfohlene Studie: „Java-Video-Tutorial

In der täglichen Entwicklung stößt man häufig auf das synchronisierte Schlüsselwort. Wissen Sie, wie man synchronisiert verwendet? Dieser Artikel wird es Ihnen vorstellen.

Wir haben zwei Möglichkeiten, die Synchronisierung zu verwenden:

  • Synchronisierte Methoden verwenden
  • Synchronisierte Anweisungen oder Blöcke verwenden

Synchronisierte Methoden verwenden

Um eine Methode zu synchronisieren, fügen Sie einfach das synchronisierte Schlüsselwort zu ihrer Deklaration hinzu:

public class SynchronizedDemo {

    private int i = 0;

    public synchronized void add() {
        i++;
    }

    public synchronized void del() {
        i--;
    }

    public synchronized int getValue() {
        return i;
    }
}
Nach dem Login kopieren

Wie im obigen Code gezeigt, gibt es drei Synchronisationsmethoden:

  • add()
  • del()
  • getValue()

Jede Methode wird nur einmal gleichzeitig für dasselbe Objekt aufgerufen. Wenn beispielsweise ein Thread add () aufruft, werden andere Threads blockiert, bis der erste Thread die Verarbeitung der Methode add () abgeschlossen hat.

Verwenden Sie synchronisierte Anweisungen oder Blöcke

    public void del(int value){

        synchronized(this){
            this.i -= value;
        }
    }
Nach dem Login kopieren

Im obigen Code wird synchronisiert vor einem {}-Code hinzugefügt, der einen synchronisierten Codeblock darstellt.

Die oben genannten zwei Möglichkeiten, das synchronisierte Schlüsselwort zu verwenden, stellen wir kurz die Konzepte im Zusammenhang mit der Synchronisierung vor.

Was ist Synchronisation?

Synchronisierung ist ein Prozess, der den Zugriff mehrerer Threads auf eine gemeinsame Ressource steuert und so inkonsistente Ergebnisse vermeidet. Der Hauptzweck der Verwendung der Synchronisierung besteht darin, inkonsistentes Verhalten von Threads zu vermeiden und Thread-Interferenzen zu verhindern.

Sie können das synchronisierte Schlüsselwort in Java verwenden, um Synchronisierungseffekte zu erzielen, die nur auf Methoden und Blöcke angewendet werden können, nicht auf Variablen und Klassen.

Warum müssen wir synchronisieren?

Schauen wir uns zunächst einen Code an:

public class SynchronizedDemo {

    int i;

    public void increment() {
        i++;
    }

    public static void main(String[] args) {
        SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
        synchronizedDemo.increment();
        System.out.println("计算值为:" + synchronizedDemo.i);
    }
}
Nach dem Login kopieren

Jedes Mal, wenn die increment()-Methode aufgerufen wird, wird der berechnete Wert um 1 erhöht:

Bei 2-maligem Aufruf werden 2 hinzugefügt, wenn sie aufgerufen wird 3 Mal werden 3 hinzugefügt, und wenn es 4 Mal aufgerufen wird, werden 3 hinzugefügt:

public class SynchronizedDemo {

    int i;

    public void increment() {
        i++;
    }

    public static void main(String[] args) {
        SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
        synchronizedDemo.increment();
        synchronizedDemo.increment();
        synchronizedDemo.increment();
        synchronizedDemo.increment();
        System.out.println("计算值为:" + synchronizedDemo.i);
    }
}
Nach dem Login kopieren

Das Ergebnis der Berechnung zu diesem Zeitpunkt ist wie erwartet, das Ergebnis ist 10.

Dies ist eine Single-Threaded-Situation, alles ist so gut, aber ist das wirklich so? Wie würde es aussehen, wenn es eine Multithread-Umgebung wäre?

Lassen Sie uns unten die Multithreading-Situation demonstrieren!

public class SynchronizedDemo {

    int i;

    public void increment() {
        i++;
    }

    public static void main(String[] args) {
        SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
        Thread thread = new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                synchronizedDemo.increment();
            }
        });
        thread.start();
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("计算值为:" + synchronizedDemo.i);
    }
}
Nach dem Login kopieren

Wie im obigen Code gezeigt, haben wir zwei Threads Thread1 und Thread2 erstellt und jeder Thread hat increment() 1000 Mal aufgerufen. Theoretisch sollte der endgültige gedruckte Wert

2000

sein, da sich der Wert ändert, nachdem Thread1 Inkrement aufruft () 1000 Mal wird 1000. Nachdem Thread2 1000 Mal Inkrement () aufruft, wird der Wert 2000.

Lassen Sie es uns ausführen und das Ergebnis sehen:

Das Ergebnis ist anders als wir dachten. Es ist weniger als 2000. Führen wir es noch einmal aus:

Das Ergebnis ist immer noch kleiner als 2000.

Warum ist das so?

Da Multithreading die parallele Verarbeitung unterstützt, ist es immer möglich, dass zwei Threads gleichzeitig den Wert des Zählers abrufen und daher beide den gleichen Zählerwert erhalten. In diesem Fall wird also der Wert des Zählers nicht erhöht Zähler zweimal, er erhöht ihn nur einmal.

Wie kann man diese Situation vermeiden?

Verwenden Sie das synchronisierte Schlüsselwort, um es zu lösen.

Wir müssen nur synchronisiert zur Methode increment() hinzufügen:

public class SynchronizedDemo {

    int i;

    public void increment() {
        i++;
    }

    public static void main(String[] args) {
        SynchronizedDemo synchronizedDemo = new SynchronizedDemo();

        Thread thread1 = new Thread(() -> {
            for (int i = 1; i <= 1000; i++) {
                synchronizedDemo.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 1; i <= 1000; i++) {
                synchronizedDemo.increment();
            }
        });

        thread1.start();
        thread2.start();
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("计算值为:" + synchronizedDemo.i);
    }
}
Nach dem Login kopieren

Lass es uns zu diesem Zeitpunkt noch einmal ausführen:

Sie können sehen, dass der Wert 2000 ist.

Wir erhöhen die Anzahl der Berechnungen auf 10.000 mal:

public class SynchronizedDemo {

    int i;

    public synchronized void increment() {
        i++;
    }

    public static void main(String[] args) {
        SynchronizedDemo synchronizedDemo = new SynchronizedDemo();

        Thread thread1 = new Thread(() -> {
            for (int i = 1; i <= 1000; i++) {
                synchronizedDemo.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 1; i <= 1000; i++) {
                synchronizedDemo.increment();
            }
        });

        thread1.start();
        thread2.start();
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("计算值为:" + synchronizedDemo.i);
    }
}
Nach dem Login kopieren
Das Ausführungsergebnis ist:

Es ist ersichtlich, dass ein wenig Synchronisierung dieses Problem so einfach löst.

Das Prinzip dahinter besteht darin, dass Thread 1 die Methode automatisch sperrt, wenn sie synchronisiert ist. Zu diesem Zeitpunkt besitzt nur Thread 1 die Sperre und andere Threads können nur warten, bis Thread 1 die Methode freigibt Erst nach dem Sperren der Sperre kann Thread 2 am Aufruf teilnehmen.

Wenn Thread 2 inkrementiert (), erhält Thread 1 die Sperre und Thread 1 wartet, bis Thread 2 die Sperre aufhebt. Auf diese Weise treten während dieses Vorgangs keine Berechnungsfehler auf.

Zusammenfassung

  • Das synchronisierte Schlüsselwort ist die einzige Möglichkeit, einen Block oder eine Methode zu synchronisieren.
  • Das synchronisierte Schlüsselwort bietet Sperrfunktionen, die sicherstellen, dass keine Race Conditions zwischen Threads auftreten. Nach dem Sperren kann der Thread nur Daten aus dem Hauptspeicher lesen. Nach dem Lesen der Daten wird der Schreibvorgang gelöscht, bevor die Sperre aufgehoben werden kann. Das Schlüsselwort
  • synchronized trägt auch dazu bei, eine Neuordnung von Programmanweisungen zu vermeiden.

Empfohlenes Lernen: „Java-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEin Beispiel, um zu verstehen, wie das synchronisierte Schlüsselwort in Java verwendet wird. 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)

Heiße Themen

Java-Tutorial
1662
14
PHP-Tutorial
1262
29
C#-Tutorial
1235
24
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

PHP: Eine Schlüsselsprache für die Webentwicklung PHP: Eine Schlüsselsprache für die Webentwicklung Apr 13, 2025 am 12:08 AM

PHP ist eine Skriptsprache, die auf der Serverseite weit verbreitet ist und insbesondere für die Webentwicklung geeignet ist. 1.PHP kann HTML einbetten, HTTP -Anforderungen und Antworten verarbeiten und eine Vielzahl von Datenbanken unterstützt. 2.PHP wird verwendet, um dynamische Webinhalte, Prozessformdaten, Zugriffsdatenbanken usw. mit starker Community -Unterstützung und Open -Source -Ressourcen zu generieren. 3. PHP ist eine interpretierte Sprache, und der Ausführungsprozess umfasst lexikalische Analyse, grammatikalische Analyse, Zusammenstellung und Ausführung. 4.PHP kann mit MySQL für erweiterte Anwendungen wie Benutzerregistrierungssysteme kombiniert werden. 5. Beim Debuggen von PHP können Sie Funktionen wie error_reporting () und var_dump () verwenden. 6. Optimieren Sie den PHP-Code, um Caching-Mechanismen zu verwenden, Datenbankabfragen zu optimieren und integrierte Funktionen zu verwenden. 7

PHP vs. Python: Verständnis der Unterschiede PHP vs. Python: Verständnis der Unterschiede Apr 11, 2025 am 12:15 AM

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

Php gegen andere Sprachen: Ein Vergleich Php gegen andere Sprachen: Ein Vergleich Apr 13, 2025 am 12:19 AM

PHP eignet sich für die Webentwicklung, insbesondere für die schnelle Entwicklung und Verarbeitung dynamischer Inhalte, ist jedoch nicht gut in Anwendungen auf Datenwissenschaft und Unternehmensebene. Im Vergleich zu Python hat PHP mehr Vorteile in der Webentwicklung, ist aber nicht so gut wie Python im Bereich der Datenwissenschaft. Im Vergleich zu Java wird PHP in Anwendungen auf Unternehmensebene schlechter, ist jedoch flexibler in der Webentwicklung. Im Vergleich zu JavaScript ist PHP in der Back-End-Entwicklung präziser, ist jedoch in der Front-End-Entwicklung nicht so gut wie JavaScript.

PHP vs. Python: Kernmerkmale und Funktionen PHP vs. Python: Kernmerkmale und Funktionen Apr 13, 2025 am 12:16 AM

PHP und Python haben jeweils ihre eigenen Vorteile und eignen sich für verschiedene Szenarien. 1.PHP ist für die Webentwicklung geeignet und bietet integrierte Webserver und reichhaltige Funktionsbibliotheken. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit prägnanter Syntax und einer leistungsstarken Standardbibliothek. Bei der Auswahl sollte anhand der Projektanforderungen festgelegt werden.

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

Auswirkungen von PHP: Webentwicklung und darüber hinaus Auswirkungen von PHP: Webentwicklung und darüber hinaus Apr 18, 2025 am 12:10 AM

PhPhas significantantyPactedWebDevelopmentAndendendsbeyondit.1) iTpowersMAjorPlatforms-LikewordpressandExcelsInDatabaseInteractions.2) php'SadaptabilityAllowStoscaleForLargeApplicationsfraMe-Linien-Linien-Linien-Linienkripte

PHP: Die Grundlage vieler Websites PHP: Die Grundlage vieler Websites Apr 13, 2025 am 12:07 AM

Die Gründe, warum PHP für viele Websites der bevorzugte Technologie -Stack ist, umfassen die Benutzerfreundlichkeit, die starke Unterstützung der Community und die weit verbreitete Verwendung. 1) Einfach zu erlernen und zu bedienen, geeignet für Anfänger. 2) eine riesige Entwicklergemeinschaft und eine reichhaltige Ressourcen haben. 3) in WordPress, Drupal und anderen Plattformen häufig verwendet. 4) Integrieren Sie eng in Webserver, um die Entwicklung der Entwicklung zu vereinfachen.

See all articles