Etter .NET 4.0 ble en sikker lazy loading-type gitt i .NET FrameworkLat Lazy kan operere i et flertrådet miljø, garantertGetValueFunksjonen utføres kun én gang, og implementeres dermedSingleton-modus
Tidligere brukte vi kvadratiske vurderingslås for å implementere singleton-mønstre, eller for å bruke statiske initialiseringsfunksjoner for klasser Med Lazy-typen blir denne prosessen forenklet og ytelsen bedre
Når Lazy opprettes, kan du spesifisere trådinstallasjonsmodus, det finnes for øyeblikket to moduser,Kun publikasjon,Eksklusjonogpublisering
Kun publikasjon-modus
1. Kjør initialiseringsfunksjonen og boks den inn i en internEsketype, løs problemet med nullverdivurdering, hvis tilfellet er opprettet, vil det returnere null,Prosessen er trådusikker
2. Bestem om m_boxed er tom, m_boxed er feltet lagret av verdi, hvis det er lik tomt, settes det til bokset, denne metoden kan sikre atomisitet,Prosessen er trådsikker
3. Hvis CreateValue returnerer tomt, betyr det at andre tråder allerede har opprettet instanser, og deretter settes til allerede opprettede instanser
4. Merk initialiseringsmetoden som initialisert, noe som vanligvis skjer ved samtidig kjøring, og kjør CreateValue flere ganger
Kun publikasjonmodus brukes basert påInterlocked.CompareExchange, denne klassen inneholder atomisitetsmetoderCAS (Sammenlign og bytte)
CAS er implementert ved bruk av atomære instruksjoner levert av CPU-en, og ulike kjøretidsversjoner kan ha forskjellige implementasjoner Interlocked spesifikk implementering I den native metoden kan interesserte venner sjekke den spesifikke implementasjonen gjennom coreclr/jvm-kode
I denne modusen,En singleton-funksjon kan kjøres flere ganger, men til slutt er det garantert at bare én instans vil bli oppnådd
ExcutionAndPubliseringsmodus
EksklusjonogpubliseringModus brukt i modusenVolatile+Monitor,MonitorDet er detlåsImplementeringen av setningen, Monitor-implementeringen i den opprinnelige koden, er en tungvektslås
MonitorKø- og trådsøvn støttes, noe som kan sikre at hele metodeblokken kjøres i en enkelttrådet tilstand
Original lenke:Innloggingen med hyperkoblingen er synlig. |