Instrucțiunea lock ia mutex-ul unui obiect dat, execută un bloc de instrucțiuni și apoi eliberează blocarea. Când ții o lacătă, firul care o ține poate obține și elibera din nou lacătul. Orice alt fir de ață este blocat să obțină lacătul și așteaptă până când acesta este eliberat.
Recenzie:
Folosește codul de încuietoare
Echivalent cu
Se poate considera că codul de bază al Lock este implementat de Monitor.
Deoarece codul folosește try... finalblock, deci chiar dacă o excepție este aruncată în corpul instrucțiunii blocării, blocajul este eliberat.
Nu poți folosi blocarea operatorului await în corpul instrucțiunii.Nu poți să o folosești în corpul enunțuluiașteaptăBlocarea operatorului。 Nu poți folosi blocarea operatorului await în corpul instrucțiunii. Nu poți folosi blocarea operatorului await în corpul instrucțiunii. Această propoziție este foarte importantă!
Documentație:Autentificarea cu hyperlink este vizibilă.
Eu testez codul,Folosește Task pentru a obține încuietoarea și folosește await pentru a bloca, codul este următorul:
După ce se execută codul următor de mai multe ori, rezultatul execuției nu este așa cum era de așteptat.
De ce? Dacă încerci să folosești cuvântul cheie await când încerci să folosești cuvântul cheie await în blocul de blocare, vei primi această eroare de compilare: cannot await în corpul unei instrucțiuni de blocare. Motivul este că, după finalizarea await, metoda poate rula într-un alt fir de execuție în locul firului (firul apelant) înainte de cuvântul cheie await.cuvântul cheie lock-cheieacelași fir de discuțieIa lacătul și eliberează lacătul în încuietoare。 Modifică codul pentru a vedea motivul mai intuitiv:
Obține ID-ul filetei lacătului și ID-ul filetei eliberării lacătului,Evident, nu pe un fir de discuție, astfel încât lacătul nu poate fi eliberat cu succes, așa cum se arată în figura de mai jos:
Am încercat să modific codul, am testat cu firul de execuție, am executat de mai multe ori și a funcționat conform așteptărilor, codul este următorul:
(Sfârșit)
|