După .NET 4.0, un tip securizat de încărcare leneșă a fost oferit în .NET FrameworkLeneș Lazy poate funcționa într-un mediu multi-threaded, garantatGetValueFuncția este executată o singură dată, implementând astfelModul singleton
În trecut, am folosit blocaje de judecată cuadratică pentru a implementa modele singleton sau pentru a utiliza funcții statice de inițializare ale claselor Cu tipul leneș, acest proces este simplificat, iar performanța este mai bună
Când Lazy este creat, poți specifica modul de instalare a firului de execuție, în prezent există două moduri,Doar publicare,Explicație și publicație
Modul PublicationOnly
1. Rulează funcția de inițializare și încapsulează-o într-un sistem internCutietip, rezolvă problema judecății de valoare nulă, dacă cazul a fost creat, va returna nul,Procesul este nesigur din punct de vedere al firului de execuție
2. Determină dacă m_boxed este vid, m_boxed este câmpul salvat după valoare, dacă este egal cu vid, este setat pe boxed, această metodă poate asigura atomicitatea,Procesul este sigur la thread
3. Dacă CreateValue returnează "goal", înseamnă că alte fire de execuție au creat deja instanțe, apoi setați pe instanțe deja create
4. Marcați metoda de inițializare ca fiind inițializată, ceea ce apare de obicei în cazul execuției concurente, și rulați CreateValue de mai multe ori
Doar publicaremodul este folosit pe bazaInterblocat.CompareExchange, această clasă conține metode de atomicitateCAS (Comparație și schimbare)
CAS este implementat folosind instrucțiuni atomice furnizate de CPU, iar versiunile diferite de runtime pot avea implementări diferite Implementare specifică interblocată În metoda nativă, prietenii interesați pot verifica implementarea specifică prin cod coreclr/jvm
În acest mod,O funcție singleton poate rula de mai multe ori, dar în final este garantat că va fi obținută o singură instanță
Mod de excuție și publicare
Explicație și publicațiemodul folosit în modulVolatile+Monitor,MonitorEstelacătImplementarea instrucțiunii, implementarea Monitor în codul nativ, este un blocaj greu
MonitorSunt suportate coada și sleep-ul de fire, ceea ce poate asigura că întregul bloc de metodă este executat într-o stare single-threaded
Link original:Autentificarea cu hyperlink este vizibilă. |