Efter .NET 4.0 tillhandahölls en säker lazy loading-typ i .NET FrameworkLat Lazy kan arbeta i en multitrådad miljö, garanteratGetValueFunktionen utförs endast en gång, vilket innebär att implementeringen implementerasSingletonläge
Tidigare använde vi kvadratiska bedömningslås för att implementera singleton-mönster, eller för att använda statiska initialiseringsfunktioner för klasser Med Lazy-typen förenklas denna process och prestandan är bättre
När Lazy skapas kan du ange trådinstallationsläget, det finns för närvarande två lägen,Endast publikation,ExcutionAndPublication
Publiceringsläge endast
1. Kör initialiseringsfunktionen och rama in den i en internLådatyp, lös problemet med nullvärdesbedömning, om fallet har skapats, kommer det att returnera null,Processen är trådosäker
2. Bestäm om m_boxed är tom, m_boxed är fältet sparat av värdet, om det är lika med tomt sätts det till boxed, denna metod kan säkerställa atomicitet,Processen är trådsäker
3. Om CreateValue returnerar tomt betyder det att andra trådar redan har skapat instanser, och sedan sätter till redan skapade instanser
4. Markera initialiseringsmetoden som initierad, vilket vanligtvis sker vid samtidig körning, och kör CreateValue flera gånger
Endast publikationläge används baserat påInterlocked.CompareExchange, denna klass innehåller atomicitetsmetoderCAS (Jämför och byt)
CAS implementeras med atomära instruktioner som tillhandahålls av CPU:n, och olika runtime-versioner kan ha olika implementationer Interlockad specifik implementation I den inbyggda metoden kan intresserade vänner kontrollera den specifika implementationen via coreclr/jvm-kod
I detta läge,En singleton-funktion kan köras flera gånger, men i slutändan garanteras att endast en instans erhålls
ExcutionAndPubliceringsläge
ExcutionAndPublicationLäge som används i lägetVolatile+Monitor,BildskärmDet är detlåsImplementeringen av satsen, Monitor-implementeringen i den inbyggda koden, är ett tungviktslås
BildskärmKö- och trådvila stöds, vilket kan säkerställa att hela metodblocket körs i ett enkeltrådat tillstånd
Originallänk:Inloggningen med hyperlänken är synlig. |