MS Link:Inloggningen med hyperlänken är synlig.
Det flyktiga nyckelordet indikerar att ett fält kan modifieras av flera trådar som körs samtidigt. Fält som deklareras som flyktiga begränsas inte av kompilatoroptimering (förutsatt att de nås av en enda tråd). Detta säkerställer att fältet alltid renderas med det senaste värdet.
Den flyktiga modifieraren används vanligtvis för fält som nås av flera trådar men som inte serialiserar åtkomsten med en lock-sats.
Flyktiga nyckelord kan tillämpas på följande typer av fält:
- Citationstyp.
- Pekartyp (i ett osäkert sammanhang). Observera att även om pekaren själv kan vara föränderlig, kan objektet den pekar på inte vara föränderligt. Med andra ord kan "pekare till ett föränderligt objekt" inte deklareras.
- Typer som Sbyte, Byte, Short, Ushort, Int, Uint, Char, Float och Boool.
- En enum-typ med en av följande bastyper: byte, sbyte, short, ushort, int eller uint.
- Generiska typparametrar som är kända för att vara referenstyper.
- IntPtr och UIntPtr.
Variabelnyckelord kan endast tillämpas på fält i en klass eller struktur.Lokala variabler kan inte deklareras som flyktiga。
Inget mer nonsens, skriv en loop för att testa det:
Låt oss testa det 10 000 gånger i en loop,fann att utdata av ett värde är korrekt, men,Det förklarar inteVolatile är trådsäkerFör om du testar det många gånger kommer du att upptäcka att det finns beräkningsfel! För det finns en chans till ett korrekt resultat och en chans till ett felaktigt resultat
Kod:
Låt oss testa 100 000 loopar igen, och vi kan upptäcka att värdet på a är felaktigt, eftersom ju mindre antal loopar, desto mindre risk för fel, och felet är inte lika uppenbart, precis som det inte fanns något fel efter 10 000 loopar just nu.
Vid denna tidpunkt lägger vi till ett lås för att testa, och det kan ses att värdet av a beräknas korrekt som vi förväntade oss.
Kod:
Sammanfattning: volatile garanterar inte trådsäkerhet, som du kan se i exemplet ovan.
|