Lock-satsen tar mutexen av ett givet objekt, exekverar ett satsblock och släpper sedan låset. När man håller ett lås kan gängan som håller låset ta upp och släppa låset igen. Alla andra trådar blockeras från att få låset och väntar tills låset släpps.
Recension:
Använd låskoden
Ekvivalent med
Man kan tänka sig att den underliggande koden i Lock implementeras av Monitor.
Eftersom koden använder försök... Finalblock, så även om ett undantag kastas i lock-satsens kropp, släpps locket.
Du kan inte använda låset för await operator i själva satsen.Du kan inte använda det i själva uttalandets huvuddelväntaOperatörslås。 Du kan inte använda låset för await operator i själva satsen. Du kan inte använda låset för await operator i själva satsen. Den här meningen är mycket viktig!
Dokumentation:Inloggningen med hyperlänken är synlig.
Jag testar koden själv,Använd Uppgift för att få låset och använd vänta på att blockera, koden är följande:
Efter att ha kört följande kod flera gånger blir resultatet inte som förväntat.
Varför? Om du försöker använda nyckelordet await när du försöker använda await-nyckelordet i lockblocket, får du detta kompileringsfel: cannot await i brödtexten av en lock-sats. Anledningen är att efter att await är slutfört kan metoden köras i en annan tråd istället för tråden (som anropar tråden) före await-nyckelordet.lockkeywordSamma trådLås och släpp lås i låset。 Modifiera koden för att se orsaken mer intuitivt:
Få tag på gäng-id på låset och gäng-id på låssläppet,Uppenbarligen inte i en tråd, så låset kan inte släppas framgångsrikt, som visas i figuren nedan:
Försökte modifiera koden, testade med tråd, körde flera gånger, och det fungerade som förväntat, koden är följande:
(Slut)
|