Po .NET 4.0 bol v .NET Framework zabezpečený typ lenivého načítavaniaLenivý Lazy dokáže fungovať v multi-threaded prostredí, čo je zaručenéGetValueFunkcia sa vykoná iba raz, čím sa implementujeSingleton mód
V minulosti sme používali kvadratické úsudkové zámky na implementáciu singleton vzorov alebo na využitie statických inicializačných funkcií tried Pri Lazy type je tento proces zjednodušený a výkon je lepší
Keď sa vytvorí Lazy, môžete špecifikovať režim inštalácie vlákien, momentálne sú k dispozícii dva režimy,Iba publikácia,ExcutionAPublikácia
Režim Iba publikácia
1. Spustiť inicializačnú funkciu a zaradiť ju do interného priečinkaKrabicatyp, vyriešiť problém nulového hodnotového súdu, ak bol prípad vytvorený, vráti null,Proces je nezabezpečený podľa vlákien
2. Zistite, či je m_boxed prázdny, m_boxed je pole uložené podľa hodnoty, ak je rovné prázdne, je nastavené na boxed, táto metóda môže zabezpečiť atómovosť,Proces je bezpečný pre vlákna
3. Ak CreateValue vráti prázdne, znamená to, že iné vlákna už vytvorili inštancie a potom nastavia na už vytvorené inštancie
4. Označiť inicializačnú metódu ako inicializovanú, čo sa zvyčajne vyskytuje pri súbežnom behu, a opakovane spúšťať CreateValue
Iba publikáciaRežim sa používa na základeInterlocked.CompareExchange, táto trieda obsahuje metódy atómovostiCAS (Porovnanie a výmena)
CAS je implementovaný pomocou atómových inštrukcií poskytovaných CPU a rôzne verzie behu môžu mať rôzne implementácie Interlockovaná špecifická implementácia V natívnej metóde môžu záujemcovia skontrolovať konkrétnu implementáciu cez coreclr/jvm kód
V tomto režime,Singletonová funkcia môže bežať viackrát, ale nakoniec je zaručené, že získame iba jednu inštanciu
Režim ExcutionAndPublication
ExcutionAPublikáciaRežim používaný v tomto režimeVolatile+Monitor,MonitorJe to takzámokImplementácia príkazu, implementácia Monitor v natívnom kóde, je ťažký zámok
MonitorPodporuje sa spánok fronty a vlákien, čo môže zabezpečiť, že celý blok metódy bude vykonaný v jednovláknovom stave
Pôvodný odkaz:Prihlásenie na hypertextový odkaz je viditeľné. |