Po .NET 4.0 byl v .NET Framework zaveden bezpečný typ pro líné načítáníLíný Lazy je schopen pracovat v vícevláknovém prostředí, což je zaručenéGetValueFunkce se vykoná pouze jednou, čímž se implementujeSingleton mód
V minulosti jsme používali kvadratické zámky hodnocení k implementaci singleton vzorů nebo k využití statických inicializačních funkcí tříd U typu Lazy je tento proces zjednodušený a výkon je lepší
Když je Lazy vytvořen, můžete specifikovat režim instalace vlákna, momentálně jsou k dispozici dva režimy,Pouze publikace,ExkutaceA Publikace
Režim Publikace pouze
1. Spusť funkci inicializace a zablokovat ji do interního systémuKrabicetyp, vyřeší problém nulového hodnotového soudu, pokud byl případ vytvořen, vrátí null,Proces je nebezpečný podle vláken
2. Určite, zda je m_boxed prázdný, m_boxed je pole uložené podle hodnoty, pokud je rovno prázdnému, je nastaveno na boxed, tato metoda může zajistit atomicitu,Proces je bezpečný pro vlákna
3. Pokud CreateValue vrátí prázdné, znamená to, že ostatní vlákna již vytvořila instance, poté nastaví na již vytvořené instance
4. Označte inicializační metodu jako inicializovanou, což obvykle nastává v případě souběžného běhu, a spusťte CreateValue několikrát
Pouze publikaceRežim se používá na základěInterlocked.CompareExchange, tato třída obsahuje metody atomickéCAS (Porovnávání a výměna)
CAS je implementován pomocí atomických instrukcí poskytovaných CPU a různé runtime verze mohou mít různé implementace Specifická implementace propojených prvků V nativní metodě mohou zájemci ověřit konkrétní implementaci prostřednictvím kódu coreclr/jvm
V tomto režimu,Singletonová funkce může běžet vícekrát, ale nakonec je zaručeno, že získá pouze jednu instanci
Režim ExcutionAPublikace
ExkutaceA PublikaceRežim používaný v tomto režimuVolatile+Monitor,MonitorTo jezamknoutImplementace příkazu, implementace Monitor v nativním kódu, je těžký zámek
MonitorPodporuje se spánek fronty a vláken, což může zajistit, že celý blok metody bude vykonán v jednovláknovém stavu
Původní odkaz:Přihlášení k hypertextovému odkazu je viditelné. |