Lock-setningen tar mutexen til et gitt objekt, utfører en statement-blokk, og frigjør deretter låsen. Når man holder en lås, kan gjengen som holder låsen ta opp og slippe låsen igjen. Enhver annen tråd er blokkert fra å få låsen og venter til låsen er frigjort.
Anmeldelse:
Bruk låsekoden
Ekvivalent med
Det kan antas at den underliggende koden i Lock er implementert av Monitor.
Siden koden bruker try... Finalblock, så selv om et unntak legges inn i selve låssetningen, frigjøres låsen.
Du kan ikke bruke await-operatorlåsen i selve uttalelsen.Du kan ikke bruke det i selve uttalelsenventOperatørlås。 Du kan ikke bruke await-operatorlåsen i selve uttalelsen. Du kan ikke bruke await-operatorlåsen i selve uttalelsen. Denne setningen er veldig viktig!
Dokumentasjon:Innloggingen med hyperkoblingen er synlig.
Jeg tester koden selv,Bruk Oppgave for å få låsen og bruk vent på å blokkere, koden er som følger:
Etter å ha kjørt følgende kode flere ganger, er resultatet ikke som forventet.
Hvorfor? Hvis du prøver å bruke await-nøkkelordet når du prøver å bruke await-nøkkelordet i låseblokken, vil du få denne kompileringsfeilen: cannot await i selve delen av en lock-setning. Årsaken er at etter at await er fullført, kan metoden kjøre i en annen tråd i stedet for tråden (som kaller tråden) før await-nøkkelordet.lockkeywordSamme trådFå lås og slipp lås i låsen。 Endre koden for å se grunnen mer intuitivt:
Få gjenge-id på låsen og tråd-id på låsefrigjøreren,Selvfølgelig ikke i en tråd, så låsen kan ikke åpnes med hell, som vist i figuren nedenfor:
Prøvde å endre koden, testet med tråd, kjørte flere ganger, og det fungerte som forventet, koden er som følger:
(Slutt)
|