Po .NET 4.0 w .NET Framework wprowadzono bezpieczny typ leniwego ładowaniaLeniwy Lazy może działać w środowisku wielowątkowym, gwarantowanymGetValueFunkcja jest wykonywana tylko raz, co implementujeTryb singleton
W przeszłości używaliśmy kwadratowych blokad oceny do implementacji wzorców singleton lub do wykorzystania statycznych funkcji inicjalizacyjnych klas W przypadku typu Lazy proces ten jest uproszczony, a wydajność lepsza
Gdy Lazy zostanie utworzony, możesz określić tryb instalacji wątku, obecnie są dwa tryby,Tylko publikacja,EksekcjaI Publikacja
Tryb Tylko Publikacja
1. Uruchomić funkcję inicjalizacji i umieścić ją w pudełku wewnętrznymPudełkotyp, rozwiązuje problem oceny wartości zerowej, jeśli przypadek został utworzony, zwróci wartość null,Proces jest niezabezpieczony wątkiem
2. Określ, czy m_boxed jest pusty, m_boxed jest pola zapisane przez wartość; jeśli jest równe pustemu, jest ustawione na pudełkowe, ta metoda może zapewnić atomowość,Proces jest bezpieczny pod względem wątków
3. Jeśli CreateValue zwraca puste, oznacza to, że inne wątki już utworzyły instancje, a następnie ustawiają na już utworzone instancje
4. Oznacz metodę inicjalizacji jako inicjalizowaną, co zwykle występuje w przypadku jednoczesnego uruchomienia, i wykonaj CreateValue wielokrotnie
Tylko publikacjaTryb jest używany na podstawieInterlocked.CompareExchange, ta klasa zawiera metody atomowościCAS (porównanie i zamiana)
CAS jest implementowany za pomocą instrukcji atomowych dostarczanych przez CPU, a różne wersje w środowisku uruchomieniowym mogą mieć różne implementacje Implementacja specyficzna dla powiązanych elementów W natywnej metodzie zainteresowani przyjaciele mogą sprawdzić konkretną implementację za pomocą kodu coreclr/jvm
W tym trybie,Funkcja singleton może działać wielokrotnie, ale ostatecznie gwarantowane jest, że uzyskamy tylko jeden przypadek
Tryb ExcutionIPublication
EksekcjaI PublikacjaTryb używany w tym trybieVolatile+Monitor,MonitorTak jestzamekImplementacja tego polecenia, czyli implementacja Monitora w natywnym kodzie, jest dużą blokadą
MonitorObsługiwane są tryby uśpienia kolejek i wątków, co może zapewnić, że cały blok metody jest wykonywany w stanie jednowątkowym
Oryginalny link:Logowanie do linku jest widoczne. |