Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 20027|Svar: 0

[Källa] C#-låsnyckelordet markerar ett block av satser som ett kritiskt område genom att erhålla en mutex för ett givet objekt, köra satsen, men...

[Kopiera länk]
Publicerad på 2015-12-31 17:51:01 | | |
Lock-nyckelordet markerar ett block av satser som en kritisk zon genom att ta en mutex för ett givet objekt, köra satsen och sedan släppa låset.

Lock-satsen använder i princip Monitor.Enter och Monitor.Exit, det vill säga Monitor.Enter(this) utförs när lock(this) körs, och Monitor.Exit(this) körs i slutet av curly-bracet. Vad betyder det? För vilket objekt som helst är den första delen av minnet adressen till alla metoder, och den andra delen är ett index. Han pekar på en SyncBlock i SyncBlock Cache-området i CLR:n. Vad betyder det? Det vill säga, när du kör Monitor.Enter(Object), om indexvärdet för objektet är negativt, välj en SyncBlock från SyncBlock-cachen och placera dess adress i objektets index. Detta slutför låset markerat av objekt, och de andra trådarna vill utföra Monitor.Enter(object)-operationen igen, vilket får ett index med ett positivt objekt, och sedan vänta. Tills indexet blir negativt, dvs. tråden använder Monitor.Exit(object) för att göra indexet negativt.

Vad du behöver vara uppmärksam på när du använder lås:
1. lås kan inte låsa nollvärde Ett objekt kan peka på null, men null behöver inte släppas. (Se även: Att förstå full null)
2.lock kan inte låsa strängtypen, även om den också är en referenstyp. Eftersom strängtypen "hoveras" av CLR
Detta innebär att det bara finns en instans av varje given sträng i hela programmet, och samma objekt representerar den texten i alla trådar i alla körande applikationsdomäner. Därför, så länge ett lås placeras på en sträng med samma innehåll någonstans i applikationsprocessen, kommer alla instanser av den strängen i applikationen att vara låsta. Därför är det bäst att låsa privata eller skyddade medlemmar som inte kommer att bli permanenta.
3. låslås objektet är minnesgränsen för ett programblock
4. Värdetypen kan inte låsas, eftersom "objektet släpps" i rött i föregående text, och värdetypen inte är en referenstyp
5.lock undviker att låsa publika typer eller objekt som inte kontrolleras av programmet.
Till exempel, om instansen är offentligt tillgänglig kan lås (detta) vara problematiskt eftersom okontrollerad kod också kan låsa objektet. Detta kan leda till deadlocks, där två eller fler trådar väntar på att släppa samma objekt. Att låsa publika datatyper (till skillnad från objekt) kan också orsaka problem av samma anledning.
När man använder lock(this) kan värdet på klassmedlemsvariabeln ändras av metoden som inte är i den kritiska zonen

Applikationsscenario: Det används ofta för att förhindra osäkra undantag i värdet på publika variabler orsakade av flertrådade operationer för att säkerställa säkerheten i operationerna









Föregående:Win8 startar SQL Server 2012-tjänsten
Nästa:[Speed] IP-segmentets öppen port-skanner för snabb skanningshastighet!!
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com