Na .NET 4.0 werd een veilig lazy loading type aangeboden in het .NET FrameworkLui Lazy kan werken in een multithreaded omgeving, gegarandeerdGetValueDe functie wordt slechts één keer uitgevoerd, waardoor de implementatieSingleton-modus
In het verleden gebruikten we kwadratische oordeelsloten om singleton-patronen te implementeren, of om statische initialisatiefuncties van klassen te gebruiken Bij het Lazy-type wordt dit proces vereenvoudigd en is de prestatie beter
Wanneer Lazy wordt aangemaakt, kun je de thread-installatiemodus specificeren, er zijn momenteel twee modi,PublicatieAlleen,ExcutionAndPublication
Publicatiemodus
1. Voer de initialisatiefunctie uit en zet deze in een interneDoostype, los het probleem van nulwaardeoordeel op, als de case is aangemaakt, zal deze null teruggeven,Het proces is thread-onveilig
2. Bepaal of de m_boxed leeg is, m_boxed het veld is dat door de waarde wordt opgeslagen, als het gelijk is aan leeg, wordt het op een box gezet, deze methode kan de atomiciteit garanderen,Het proces is draadveilig
3. Als CreateValue leeg teruggeeft, betekent dit dat andere threads al instanties hebben aangemaakt, waarna ze op reeds gemaakte instanties worden gezet
4. Markeer de initialisatiemethode als geïnitialiseerd, wat meestal gebeurt bij gelijktijdige uitvoering, en voer CreateValue meerdere keren uit
PublicatieAlleenmodus wordt gebruikt op basis vanInterlocked.CompareExchange, bevat deze klasse atomiciteitsmethodenCAS (vergelijken en wisselen)
CAS wordt geïmplementeerd met atomaire instructies die door de CPU worden geleverd, en verschillende runtime-versies kunnen verschillende implementaties hebben Interlocked specifieke implementatie In de native methode kunnen geïnteresseerde vrienden de specifieke implementatie controleren via coreclr/jvm-code
In deze modus,Een singletonfunctie kan meerdere keren worden uitgevoerd, maar uiteindelijk is gegarandeerd dat er slechts één instantie wordt verkregen
ExcutionAndPublication mode
ExcutionAndPublicationModus gebruikt in de modusVluchtig+Monitor,MonitorDat is het welslotDe implementatie van de instructie, de Monitor-implementatie in de native code, is een zware lock
MonitorWachtrij- en threadslaap worden ondersteund, wat ervoor kan zorgen dat het gehele methodeblok in een single-threaded toestand wordt uitgevoerd
Originele link:De hyperlink-login is zichtbaar. |