Efter .NET 4.0 blev der indført en sikker lazy loading-type i .NET FrameworkDoven Lazy kan operere i et multitrådet miljø, garanteretGetValueFunktionen udføres kun én gang, hvilket implementererSingleton-tilstand
Tidligere brugte vi kvadratiske vurderingslås til at implementere singleton-mønstre eller til at anvende statiske initialiseringsfunktioner for klasser Med Lazy-typen er denne proces forenklet, og ydeevnen er bedre
Når Lazy oprettes, kan du angive trådinstallationstilstanden, der er i øjeblikket to tilstande,PublikationsOnly,ExcutionAndPublication
Publikations-Only-tilstand
1. Kør initialiseringsfunktionen og indkapsl den i en internÆsketype, løs problemet med nulværdidom, hvis tilfældet er oprettet, vil det returnere null,Processen er trådusikker
2. Bestem om m_boxed er tom, m_boxed er feltet gemt af værdien, hvis det er lig tomt, sættes det til bokset, denne metode kan sikre atomicitet,Processen er trådsikker
3. Hvis CreateValue returnerer tom, betyder det, at andre tråde allerede har oprettet instanser, og derefter sættes til allerede oprettede instanser
4. Markér initialiseringsmetoden som initialiseret, hvilket normalt sker i tilfælde af samtidig kørsel, og kør CreateValue flere gange
PublikationsOnlyMode bruges baseret påInterlocked.CompareExchange, indeholder denne klasse atomicitetsmetoderCAS (Sammenlign og Byt)
CAS implementeres ved hjælp af atomare instruktioner, som CPU'en leverer, og forskellige runtime-versioner kan have forskellige implementeringer Sammenkoblede specifikke implementeringer I den native metode kan interesserede venner tjekke den specifikke implementering gennem coreclr/jvm-kode
I denne tilstand,En singleton-funktion kan køre flere gange, men i sidste ende er det garanteret, at kun én instans opnås
ExcutionAndPublication-tilstand
ExcutionAndPublicationTilstand brugt i tilstandenVolatile+Monitor,SkærmDet er detlåsImplementeringen af sætningen, Monitor-implementeringen i den oprindelige kode, er en tungvægtslås
SkærmKø- og trådsøvn understøttes, hvilket kan sikre, at hele metodeblokken udføres i en enkelttrådet tilstand
Originalt link:Hyperlink-login er synlig. |