Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 14222|Antwort: 0

[Kommunikation] Einblick in die grundlegenden Typen von Java- und I++-Thread-Sicherheit

[Link kopieren]
Veröffentlicht am 05.04.2015 22:17:45 | | |

In Java sind die anderen Grundvariablen atomar, mit Ausnahme der 8-Byte-64-Bit-Variablen Long und Double.


Das Java-Speichermodell verlangt, dass sowohl Get- als auch Store-Operationen atomar sind, aber für nichtflüchtige Long- und Double-Variable-Operationen erlaubt das JVM, eine 64-Bit-Lese- oder Schreiboperation in zwei 32-Bit-Operationen aufzuteilen.

Wenn Lesen und Schreiben auf verschiedenen Threads erfolgen, kann das Lesen eines nichtflüchtigen Typs Long zu hohen 32 Bit des einen Werts und niedrigen 32 Bit des anderen resultieren.

Selbst wenn dir abgelaufene Daten egal sind, ist es möglicherweise nicht sicher, geteilte, veränderliche Long- und Doppelvariablen in einem Multithread-Programm zu verwenden, es sei denn, sie sind als volatil deklariert oder durch eine Sperre geschützt.


Apropos atomare Operationen bedeutet das, dass Lesen und Schreiben atomar sind, wie i=5; Das ist eine atomare Operation.

Wenn jedoch die Operation von zwei Atomen gleichzeitig ausgeführt wird, ist sie nicht zwangsläufig atomar, wie zum Beispiel zuerst lesen und dann schreiben, sodass es möglich ist, dass die Variable nach dem Lesen modifiziert wurde.

i++ ist eine solche Operation, zuerst gelesen und dann geschrieben, sodass die ganzzahlige Variable atomar ist, nicht dass i++ eine atomare Operation ist.

Wenn du for(int i=0; i<10000; i++){System.out.print(i)}

Du wirst feststellen, dass ich am Ende nicht 10.000 drucke, sondern etwa 8.000 bis 9.000.


Aber im Fall von Multithreading kann es selbst dann, wenn die ganzzahlige Variable atomar ist, Thread-Sicherheitsprobleme geben, was ein Problem mit der Thread-Sichtbarkeit ist, daher muss man eine flüchtige Anweisung hinzufügen.

Dieser Modifikator ist eine erzwungene Variable, die jedes Mal aus dem Speicher gelesen wird und nicht in Registern gespeichert wird.




Vorhergehend:SQL 2008 zeigt eine Fehlermeldung (Anbieter: SQL Network Interfaces, Fehler: 25 – Verbindungswort).
Nächster:[Fast and Furious 7] erscheint 2.12G DVD Die klarste Version im Internet
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com