|
Låsenøkkelordet markerer en blokk med setninger som en kritisk sone ved å ta en mutex for et gitt objekt, utføre setningen, og deretter frigjøre låsen.
Lock-setningen bruker i hovedsak Monitor.Enter og Monitor.Exit, det vil si at Monitor.Enter(this) utføres når lock(this) kjøres, og Monitor.Exit(this) utføres på slutten av krølleparentesen. Hva betyr det? For ethvert objekt er den første delen av minnet adressen til alle metoder, og den andre delen er en indeks. Han peker på en SyncBlock i SyncBlock Cache-området i CLR-en. Hva betyr det? Det vil si, når du kjører Monitor.Enter(Object), hvis indeksverdien til objektet er negativ, velg en SyncBlock fra SyncBlock-cachen og plasser adressen dens i objektets indeks. Dette fullfører låsen merket av objektet, og de andre trådene vil utføre Monitor.Enter(object)-operasjonen igjen, som vil få en indeks med et positivt objekt, og deretter vente. Inntil indeksen blir negativ, det vil si at tråden bruker Monitor.Exit(object) for å gjøre indeksen negativ. Det du må være oppmerksom på når du bruker lås:
1. lås kan ikke låse nullverdi Et objekt kan peke mot null, men null trenger ikke å frigjøres. (Se også: Forståelse av Full Null) 2.lock kan ikke låse strengtypen, selv om den også er en referansetype. Fordi strengtypen "hoveres" av CLR Dette betyr at det bare finnes én instans av en gitt streng i hele programmet, og det samme objektet representerer teksten i alle tråder i alle kjørende applikasjonsdomener. Derfor, så lenge en lås plasseres på en streng med samme innhold hvor som helst i applikasjonsprosessen, vil alle forekomster av den strengen i applikasjonen være låst. Derfor er det best å låse private eller beskyttede medlemmer som ikke vil bli vedvart. 3. Locklock objektet er minnegrensen til en programblokk 4. Verditypen kan ikke låses, fordi "objekt frigjøres" i rødt i forrige tekst, og verditypen ikke er en referansetype 5.lock unngår å låse offentlige typer eller objekter som ikke kontrolleres av programmet. For eksempel, hvis instansen er offentlig tilgjengelig, kan lås (dette) være problematisk fordi ukontrollert kode også kan låse objektet. Dette kan føre til deadlocks, der to eller flere tråder venter på å slippe samme objekt. Låsing av offentlige datatyper (i motsetning til objekter) kan også forårsake problemer av samme grunn. Når man bruker lock(this), kan verdien av klassemedlemsvariabelen endres av metoden som ikke er i den kritiske sonen
Applikasjonsscenario: Det brukes ofte for å forhindre usikre unntak i verdien av offentlige variabler forårsaket av flertrådede operasjoner for å sikre operasjonssikkerheten
|