Lock-udsagnet tager mutexen af et givent objekt, udfører en statement-blok og frigiver derefter låsen. Når man holder en lås, kan gevinden, der holder låsen, tage og frigive låsen igen. Enhver anden tråd blokeres fra at få låsen og venter, indtil låsen bliver frigivet.
Anmeldelse:
Brug låsekoden
Ækvivalent med
Man kan mene, at den underliggende kode i Lock er implementeret af Monitor.
Da koden bruger prøv... Finalblock, så selv hvis en undtagelse kastes i selve lock-sætningen, frigives locken.
Du kan ikke bruge await-operatorlåsen i selve udsagnet.Du kan ikke bruge det i selve udsagnetVentOperatørlås。 Du kan ikke bruge await-operatorlåsen i selve udsagnet. Du kan ikke bruge await-operatorlåsen i selve udsagnet. Denne sætning er meget vigtig!
Dokumentation:Hyperlink-login er synlig.
Jeg tester koden selv,Brug Opgave til at få låsen og brug 'vent på at blokere', koden er som følger:
Efter at have udført følgende kode flere gange, er resultatet ikke som forventet.
Hvorfor? Hvis du prøver at bruge await-nøgleordet i låseblokken, får du denne kompilationsfejl: cannot await i selve en lock-sætning. Årsagen er, at efter await er afsluttet, kan metoden køre i en anden tråd i stedet for tråden (der kalder tråden) før await-nøgleordet.lockkeywordSamme trådFå lås og frigiv lås i låsen。 Ændr koden for at se årsagen mere intuitivt:
Få gevindiddet på låsen og gevindiddet på låsefrigiveren,Selvfølgelig ikke i en tråd, så låsen ikke kan ophæves med succes, som vist i figuren nedenfor:
Prøvede at ændre koden, testede med tråd, kørte flere gange, og det virkede som forventet, koden er som følger:
(Slut)
|