Inhaltsverzeichnis
volatile-Explanation
1. Volatilität:
Heim Java javaLernprogramm Einführung in das Schlüsselwort volatile in der gleichzeitigen Java-Programmierung (mit Beispielen)

Einführung in das Schlüsselwort volatile in der gleichzeitigen Java-Programmierung (mit Beispielen)

Nov 20, 2018 pm 03:58 PM
java并发编程

Dieser Artikel bietet Ihnen eine Einführung in das flüchtige Schlüsselwort in der Java-Parallelprogrammierung (mit Beispielen). Ich hoffe, dass er Ihnen als Referenz dienen wird.

volatile-Explanation

  • Die Rolle des volatilen Schlüsselworts besteht darin, dass Variablen in mehreren Threads sichtbar sind;

  • The volatile Schlüsselwort ist nicht- Atomic

  • Wenn Sie atomare Operationen implementieren möchten, wird empfohlen, eine Reihe von Objekten der Atomklasse zu verwenden: Unterstützt atomare Operationen (beachten Sie, dass die Atomklasse nur garantiert die Atomizität der eigenen Methode und garantiert nicht die Mehrfachatomarität von Operationen)

1. Volatilität:

  • Die Rolle des Volatilitätsfaktors Das Schlüsselwort ist, dass Variablen in mehreren Threads sichtbar sind verfügen über einen Arbeitsspeicherbereich, der von allen Threads gemeinsam genutzte Informationen speichert. Eine Kopie der Variablen im Hauptspeicher. Wenn der Thread ausgeführt wird, werden diese Variablen in seinem eigenen Arbeitsspeicherbereich manipuliert. Um auf eine gemeinsam genutzte Variable zuzugreifen, erhält ein Thread normalerweise zunächst die Sperre und löscht den Speicherarbeitsbereich des aktuellen Threads und lädt diese gemeinsam genutzten Variablen korrekt aus dem gemeinsam genutzten Speicherbereich aller Threads in seinen eigenen Arbeitsspeicherbereich, um sicherzustellen, dass der Thread entsperrt ist dass die Werte von Variablen im Arbeitsspeicher in den Shared-Memory-Bereich geschrieben werden.

* Die Operationen, die ein Thread ausführen kann, sind: verwenden (verwenden), zuweisen (assgin), laden (laden), speichern (speichern), sperren (sperren), entsperren (entsperren). ) ;
* Die Operationen, die im Hauptspeicher ausgeführt werden können, sind: Lesen (Lesen), Schreiben (Schreiben), Sperren (Sperren), Entsperren (Entsperren); jede Operation ist atomar von.

  • * Die Funktion von volatile besteht darin, den Thread zu zwingen, Variablen im Hauptspeicher (gemeinsam genutzter Speicher) zu lesen, anstatt im Thread-Arbeitsspeicherbereich zu lesen, wodurch mehrere Threads realisiert werden Die Variablen dazwischen sind sichtbar. Dies erfüllt auch die Thread-sichere Sichtbarkeit.

  • public class RunThread extends Thread{
    
        private volatile boolean isRunning = true;
        private void setRunning(boolean isRunning){
            this.isRunning = isRunning;
        }
    
        public void run(){
            System.out.println("进入run方法..");
            int i = 0;
            while(isRunning == true){
                //..
            }
            System.out.println("线程停止");
        }
    
        public static void main(String[] args) throws InterruptedException {
            RunThread rt = new RunThread();
            rt.start();
            Thread.sleep(1000);
            rt.setRunning(false);
            System.out.println("isRunning的值已经被设置了false");
        }
    }
    Nach dem Login kopieren
  • 2. Das Schlüsselwort volatile ist zwar nicht atomar, hat aber keine Sichtbarkeit zwischen mehreren Threads Sie verfügen über eine Synchronisierung (d. h. Atomizität). Die Leistung ist viel besser als die Synchronisierung und verursacht keine Blockierung (in vielen Open-Source-Architekturen ist der zugrunde liegende Code von Netty flüchtig. Sichtbare Leistung von Netty).

  • * Zu beachten: Im Allgemeinen wird „volatil“ für variable Operationen verwendet, die für mehrere Threads sichtbar sind, und kann den Synchronisationseffekt von „synchronized“ nicht ersetzen

Beispiel: concurrent.java

Erklärung:

Das Schlüsselwort volatile hat nur Sichtbarkeit und keine Atomizität.
    import java.util.concurrent.atomic.AtomicInteger;
    /**
    * volatile关键字不具备synchronized关键字的原子性(同步)
    * @@author Maozw
    *
    */
    public class VolatileNoAtomic extends Thread{
        //private static volatile int count;
        private static AtomicInteger count = new AtomicInteger(0);
        private static void addCount(){
          for (int i = 0; i < 1000; i++) {
            //count++ ;
            count.incrementAndGet();
          }
          System.out.println(count);
        }
    
        public void run(){
          addCount();
        }
    
        public static void main(String[] args) {
    
          VolatileNoAtomic[] arr = new VolatileNoAtomic[100];
          for (int i = 0; i < 10; i++) {
            arr[i] = new VolatileNoAtomic();
          }
    
          for (int i = 0; i < 10; i++) {
            arr[i].start();
          }
        }
    }
    Nach dem Login kopieren
  • * Wenn Sie atomare Operationen implementieren möchten, wird empfohlen, eine Reihe von Objekten der Atomklasse zu verwenden: Unterstützt atomare Operationen (beachten Sie, dass die Atomklasse nur die Atomizität von garantiert eine eigene Methode und garantiert keine Atomizität bei mehreren Operationen)

Beispiel:
Erklärung:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicUse {

private static AtomicInteger count = new AtomicInteger(0);

    //多个addAndGet在一个方法内是非原子性的,需要加synchronized进行修饰,保证4个addAndGet整体原子性
    /**synchronized*/
    public synchronized int multiAdd(){
        try {
          Thread.sleep(100);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        count.addAndGet(1);
        count.addAndGet(2);
        count.addAndGet(3);
        count.addAndGet(4); //+10
        return count.get();
    }
    public static void main(String[] args) {

      final AtomicUse au = new AtomicUse();

      List<Thread> ts = new ArrayList<Thread>();
      for (int i = 0; i < 100; i++) {
        ts.add(new Thread(new Runnable() {
          @Override
          public void run() {
            System.out.println(au.multiAdd());
          }
        }));
      }
      for(Thread t : ts){
        t.start();
      }
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonEinführung in das Schlüsselwort volatile in der gleichzeitigen Java-Programmierung (mit Beispielen). 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)

Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Wie konvertieren Sie Namen in Zahlen, um Sortieren innerhalb von Gruppen zu implementieren? Wie konvertieren Sie Namen in Zahlen, um Sortieren innerhalb von Gruppen zu implementieren? Apr 19, 2025 pm 01:57 PM

Wie konvertieren Sie Namen in Zahlen, um Sortieren innerhalb von Gruppen zu implementieren? Bei der Sortierung von Benutzern in Gruppen ist es häufig erforderlich, den Namen des Benutzers in Zahlen umzuwandeln, damit er anders sein kann ...

Was ist der Unterschied zwischen Speicherlecks in Java -Programmen auf Arm- und X86 -Architektur -CPUs? Was ist der Unterschied zwischen Speicherlecks in Java -Programmen auf Arm- und X86 -Architektur -CPUs? Apr 19, 2025 pm 11:18 PM

Analyse des Gedächtnis -Leck -Phänomens von Java -Programmen zu verschiedenen Architektur -CPUs. In diesem Artikel wird ein Fall erläutert, in dem ein Java -Programm unterschiedliche Gedächtnisverhalten auf ARM- und X86 -Architektur -CPUs aufweist ...

See all articles