Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 2976|Răspunde: 2

[Sursă] Cum de leneș în C# păstrează firele în siguranță

[Copiază linkul]
Postat pe 02.07.2023 21:41:55 | | |
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 publicareExplicaț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+MonitorMonitorEstelacă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ă.




Precedent:ASP.NET diferența dintre ThreadStatic, CallContext și HttpContext
Următor:SQL Server interogează numărul curent de conexiuni la baza de date
 Proprietarul| Postat pe 02.07.2023 21:42:16 |
 Proprietarul| Postat pe 04.07.2023 19:19:45 |
Optimizarea performanței C#: Lazy inițializează Lazy<T> cu o întârziere
https://www.itsvse.com/thread-7700-1-1.html
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com