Nach .NET 4.0 wurde im .NET Framework ein sicherer, lazy loading Typ bereitgestelltFaul Lazy kann garantiert in einer Multithread-Umgebung arbeitenGetValueDie Funktion wird nur einmal ausgeführt und implementiert somitSingleton-Modus
Früher verwendeten wir quadratische Judgment-Locks, um Singleton-Muster zu implementieren oder um statische Initialisierungsfunktionen von Klassen zu nutzen Beim Lazy-Typ wird dieser Prozess vereinfacht und die Leistung verbessert
Wenn Lazy erstellt wird, kannst du den Thread-Installationsmodus angeben, es gibt derzeit zwei Modi,Veröffentlichung Nur,ExcutionAndPublication
Veröffentlichungsmodus
1. Führe die Initialisierungsfunktion aus und boxe sie in eine interneSchachtelTyp, das Problem des Nullwerturteils löst, wenn der Fall erstellt wurde, wird er null zurückgeben,Der Prozess ist thread-unsicher
2. Bestimmen Sie, ob das m_boxed leer ist, m_boxed das durch den Wert gespeicherte Feld ist, wenn es gleich leer ist, wird es auf geboxt gesetzt, diese Methode kann die Atomizität sicherstellen,Der Prozess ist gefädensicher
3. Wenn CreateValue leer zurückkehrt, bedeutet das, dass andere Threads bereits Instanzen erstellt haben und dann auf bereits erstellte Instanzen gesetzt werden
4. Markiere die Initialisierungsmethode als initialisiert, was normalerweise im Falle eines gleichzeitigen Laufs der Fall ist, und führe CreateValue mehrfach aus
Veröffentlichung NurDer Modus basiert aufInterlocked.CompareExchange, diese Klasse enthält AtomaritätsmethodenCAS (Vergleichen und Tauschen)
CAS wird mit atomaren Anweisungen implementiert, die von der CPU bereitgestellt werden, und verschiedene Laufzeitversionen können unterschiedliche Implementierungen haben Interlocked-spezifische Implementierung In der nativen Methode können interessierte Freunde die spezifische Implementierung über coreclr/jvm-Code überprüfen
In diesem Modus,Eine Singleton-Funktion kann mehrfach ausgeführt werden, aber letztlich ist garantiert, dass nur eine Instanz erhalten wird
ExcutionAndPublication-Modus
ExcutionAndPublicationIm Modus verwendeter ModusVolatile+Monitor,MonitorEs istSchleuseDie Implementierung der Anweisung, die Monitor-Implementierung im nativen Code, ist ein schwergewichtiger Lock
MonitorWarteschlangen- und Thread-Schlaf werden unterstützt, was sicherstellen kann, dass der gesamte Methodenblock in einem Single-Thread-Zustand ausgeführt wird
Originallink:Der Hyperlink-Login ist sichtbar. |