


Einführung in das Schlüsselwort volatile in der gleichzeitigen Java-Programmierung (mit Beispielen)
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.
- 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
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"); } }
Erklärung:
Das Schlüsselwort volatile hat nur Sichtbarkeit und keine Atomizität.* 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)
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(); } } }
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(); } } }
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



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. ...

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 ...

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 ...

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

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 ...

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? Bei der Sortierung von Benutzern in Gruppen ist es häufig erforderlich, den Namen des Benutzers in Zahlen umzuwandeln, damit er anders sein kann ...

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 ...
