L’instruction lock prend le mutex d’un objet donné, exécute un bloc d’instructions, puis libère le verrou. Lorsqu’on tient un cadenas, le fil qui le tient peut l’accrocher et le libérer à nouveau. Tout autre fil est bloqué pour obtenir la serrure et attend que la serrure soit libérée.
Révision:
Utilisez le code de verrouillage
Équivalent à
On peut penser que le code sous-jacent de Lock est implémenté par Monitor.
Puisque le code utilise try... finalblock, donc même si une exception est ajoutée dans le corps de l’instruction lock, le lock est libéré.
Vous ne pouvez pas utiliser l’opérateur await verrouiller le corps de la déclaration.Vous ne pouvez pas l’utiliser dans le corps de la déclarationattendsVerrouillage opérateur。 Vous ne pouvez pas utiliser l’opérateur await verrouiller le corps de la déclaration. Vous ne pouvez pas utiliser l’opérateur await verrouiller le corps de la déclaration. Cette phrase est très importante !
Documentation:La connexion hyperlientérée est visible.
Je teste moi-même le code,Utilise Tâche pour obtenir le verrou et utilise Attendre pour bloquer, le code est le suivant :
Après avoir exécuté plusieurs fois le code suivant, le résultat n’est pas celui attendu.
Pourquoi ? Si vous essayez d’utiliser le mot-clé await lors de l’utilisation du mot-clé await dans le bloc de verrouillage, vous obtiendrez cette erreur de compilation : ne peut pas attendre dans le corps d’une instruction de verrouillage. La raison est qu’après avoir complété await, la méthode peut s’exécuter dans un autre thread au lieu du thread (thread appelant) avant le mot-clé await.mot-clé verrouillémême filPrends le verrou et déverrouille le verrou dans le verrou。 Modifiez le code pour voir la raison de manière plus intuitive :
Obtenez l’identifiant du filetage du verrou et l’identifiant du filetage du déverrouillage,Évidemment, pas dans un fil de discussion, de sorte que le verrou ne peut pas être libéré avec succès, comme montré dans la figure ci-dessous :
J’ai essayé de modifier le code, testé avec un thread, exécuté plusieurs fois, et ça a fonctionné comme prévu, le code est le suivant :
(Fin)
|