.NET 4.0:n jälkeen .NET Frameworkiin tarjottiin turvallinen laiska lataustyyppiLaiska Lazy pystyy toimimaan monisäikeisessä ympäristössä, taatustiGetValueFunktio suoritetaan vain kerran, jolloin toteutetaanSingleton-moodi
Aiemmin käytimme kvadraattisia arviointilukkoja yksittäisten mallien toteuttamiseen tai luokkien staattisten alustusfunktioiden hyödyntämiseen Lazy-tyypissä tämä prosessi yksinkertaistuu ja suorituskyky paranee
Kun Lazy luodaan, voit määrittää säikeen asennustilan, tällä hetkellä on kaksi tilaa,Vain julkaisu,ExcutionAndPublication
PublicationOnly -tila
1. Suorita alustusfunktio ja laita se sisäiseen laatikkoonLaatikkotyyppi, ratkaise nollaarvon arviointiongelma, jos tapaus on luotu, se palauttaa nullin,Prosessi on säikeiden turvaton
2. Selvitä, onko m_boxed tyhjä, m_boxed onko arvolla tallennettu kenttä, jos se on tyhjä, se asetetaan laatikkoon, tämä menetelmä voi varmistaa atomisuuden,Prosessi on säikeiden turvallinen
3. Jos CreateValue palauttaa tyhjän, se tarkoittaa, että muut säikeet ovat jo luoneet instansseja ja asetetaan jo luoduiksi instansseiksi
4. Merkitse alustusmenetelmä alustuneeksi, mikä yleensä tapahtuu samanaikaisessa suorituksessa, ja suorita CreateValue useita kertoja
Vain julkaisutilaa käytetäänInterlocked.CompareExchange, tämä luokka sisältää atomisuusmenetelmiäCAS (Vertaa ja vaihda)
CAS toteutetaan CPU:n tarjoamien atomikäskyjen avulla, ja eri ajonaikaisilla versioilla voi olla erilaisia toteutuksia Lukittu spesifinen toteutus Natiivimenetelmässä kiinnostuneet ystävät voivat tarkistaa kyseisen toteutuksen coreclr/jvm-koodilla
Tässä tilassa,Yksittäinen funktio voi toimia useita kertoja, mutta lopulta on taattu, että saadaan vain yksi instanssi
ExcutionAndPublication-tila
ExcutionAndPublicationTilassa käytetty tilaVolatile+Monitor,MonitoriSe onlukkoLauseen toteutus, Monitor-toteutus natiivikoodissa, on raskas lukko
MonitoriJonotus- ja säike-lepotilaan toiminnot ovat tuettuja, mikä voi varmistaa, että koko metodilohko suoritetaan yksisäikeisessä tilassa
Alkuperäinen linkki:Hyperlinkin kirjautuminen on näkyvissä. |