|
Lock-nøgleordet markerer en blok af sætninger som en kritisk zone ved at tage en mutex for et givent objekt, udføre sætningen og derefter frigive låsen.
Lock-sætningen bruger grundlæggende Monitor.Enter og Monitor.Exit, det vil sige, Monitor.Enter(this) bliver udført, når lock(this) udføres, og Monitor.Exit(this) udføres i slutningen af curly-krimset. Hvad betyder det? For ethvert objekt er den første del af hukommelsen adressen på alle metoder, og den anden del er et indeks. Han peger på en SyncBlock i SyncBlock Cache-området i CLR'en. Hvad betyder det? Det vil sige, når du udfører Monitor.Enter(Object), hvis objektets indeksværdi er negativ, vælger du en SyncBlock fra SyncBlock cachen og placerer dens adresse i objektets indeks. Dette fuldender låsen markeret af objekt, og de andre tråde vil udføre Monitor.Enter(object)-operationen igen, hvilket får et indeks med et positivt objekt, og derefter venter. Indtil indekset bliver negativt, dvs. tråden bruger Monitor.Exit(object) til at gøre indekset negativt. Hvad du skal være opmærksom på, når du bruger lås:
1. lås kan ikke låse nullværdi Et objekt kan pege på null, men null behøver ikke frigives. (Se også: Forståelse af fuld null) 2.lock kan ikke låse strengtypen, selvom den også er en referencetype. Fordi strengtypen "hoveres" af CLR Det betyder, at der kun er én instans af en given streng i hele programmet, og det samme objekt repræsenterer teksten i alle tråde i alle kørende applikationsdomæner. Derfor, så længe der placeres en lås på en streng med samme indhold et sted i applikationsprocessen, vil alle forekomster af den streng i applikationen være låst. Derfor er det bedst at låse private eller beskyttede medlemmer, som ikke vil blive vedvarende. 3. Locklock, objektet er hukommelsesgrænsen for en programblok 4. Værditypen kan ikke låses, fordi "objektet frigives" i rødt i den forrige tekst, og værditypen ikke er en referencetype 5.lock undgår at låse offentlige typer eller objekter, som ikke styres af programmet. For eksempel, hvis instansen er offentligt tilgængelig, kan lås (dette) være problematisk, fordi ukontrolleret kode også kan låse objektet. Dette kan føre til deadlocks, hvor to eller flere tråde venter på at frigive det samme objekt. At låse offentlige datatyper (i modsætning til objekter) kan også forårsage problemer af samme grund. Når man bruger lock(this), kan værdien af klassemedlemsvariabelen ændres af den metode, der ikke er i den kritiske zone
Applikationsscenarie: Det bruges ofte til at forhindre usikre undtagelser i værdien af offentlige variabler forårsaget af multitrådede operationer for at sikre operationernes sikkerhed
|