edit
Memory Models
Quiz letzte Vorlesung
InvalidOperationException
, wenn während dem Download ein Element in die Collection eingefügt wird
await
haltet die Schleife an und kann den Thread wechseln. Währenddessen kann das UI die Collection ändern
Ziel
- Korrekte nebenläufige Interaktion
- Garantien des Speichermodell nutzen
- Effiziente Synchronisation, skalierbar
Probleme
- Umordnung: Optimizer kann Code-Ablauf nicht-deterministisch ändern, wenn zwei Statements unabhängig voneinander sind ("Weak Consistency")
- Keine sequentielle Konsistenz bei Nebenläufigkeit
Java Memory Model
Atomicity
- Unteilbarkeit
- Garantiert einzelnes atomares Lesen und Schreiben für Primitive Datentypen (bis 32 Bit), Objekt-Referenzen und
volatile
long und double
- Unteilbarkeit heisst nicht Sichtbarkeit: Nach einem Write kann ein Thread noch den alten Wert sehen
Visibility
- Wenn ein Thread eine Variable setzt, ist es nicht garantiert, dass ein anderer den neuen Wert sieht
- Kann nicht-deterministisch nach gewisser Zeit oder gar nie sichtbar werden
- Optimizer lädt evtl. Variable in ein Register, dass dann gar nie geupdated wird
- Optimizer beachtet nur die Ausführung in einem Thread
Garantien
- Sichtbar bei Locks (sonst würde das ganze Lock-System nicht funktionieren)
volatile
Variablen sind für andere Zugreifer immer sichtbar
- Vor dem
volatile
-Zugriff werden alle Änderungen(auch von nicht-volatile-Variablen!) für andere sichtbar, die auch auf diese Variable zugreifen
- Besser explizite Synchronisation einsetzen
- Ordnung ist vor und nach dem volatile-Zugriff garantiert, wie ein "Memory-Fence"
final
-Variablen nach Initialisierung im Constructor: "Initialized State" ist sichtbar
- Thread-Start / Join, bzw. Task Start und Ende
Ordering
- Innerhalb eines Threads wird alles sequentiell ausgeführt
- Zwischen Threads ist die Reihenfolge nur erhalten für Synchronisationsbefehle und Zugriff auf volatile-Varialben
- "Memory Fence": Keine Umordnung über Synchronisation oder Volatile-Zugriffe hinweg
Atomare Operationen
- Effiziente, atomare Instruktion des Prozessors
- Komplexer als Lesen / Schreiben
Atomic Boolean
- Kann mit
getAndSet()
atomar alten Wert lesen und neuen Wert setzen
compareAndSet()
: Atomares lesen und setzen mit Condition
- Wenn Variable expected Wert hat, wird neuer Wert gesezt und
true
returned
- Atomic Klassen gibt es auch für Integer, Long und Referenzen
Optimisitsche Synchronisation
- In einer Schleife wird versucht, den Wert zu aktualisieren
- alten Wert zwischenspeichern und versuchen zu Updaten, bis der Wert nicht nicht zwischendrin verändert wurde
- Nachteile:
- Theoretische Starvation-Möglichkeit
- Zwischenänderungen werden nicht erkannt (ABA-Problem)
- Concurrent Lockfreie Datenstrukturen sind meistens so implementiert
.NET
Volatile Read / Write
- Volatile Read: Bleibt garantiert vor den nachfolgenden Zugriffen
- Volatile Write: Bleibt garantiert nach den vorherigen Zugriffen
Thread.MemoryBarrier()
verhindert umordnung