|
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
|