lock

Références

L'actualité

Librairie

L'information

lock

L'instruction lock obtient le verrou d'exclusion mutuelle d'un objet donné, exécute un bloc d'instructions, puis libère le verrou. Tant qu'un verrou est maintenu, le thread qui contient le verrou peut à nouveau obtenir et libérer le verrou. Tout autre thread se voit bloquer l'obtention du verrou et attend que ce dernier soit libéré.

L'instruction lock se présente sous la forme

x est une expression de type référence. Elle équivaut précisément à

Dans la mesure où le code utilise un bloc try...finally, le verrou est libéré même si une exception est levée dans le corps d'une instruction lock.

Vous ne pouvez pas utiliser le mot clé await dans le corps d'une instruction lock.

Notes

Quand vous synchronisez l'accès des threads à une ressource partagée, verrouillez une instance d'objet dédiée (par exemple private readonly object balanceLock = new object();) ou toute autre instance peu susceptible d'être utilisée comme objet de verrouillage par des parties du code non associées.

Évitez d'utiliser la même instance d'objet de verrouillage pour différentes ressources partagées, car cela peut entraîner une contention d'interblocage ou de verrouillage. En particulier, évitez d'utiliser les éléments suivants en tant qu'objets de verrouillage :

  • this, qui peut être utilisé en tant que verrou par les appelants.
  • Les instances de Type, qui peuvent être obtenues par l'opérateur typeof ou par réflexion.
  • Les instances de chaîne, notamment les littéraux de chaîne, qui peuvent être internés.

Exemple

L'exemple suivant définit une classe Account, qui synchronise l'accès à son champ balance privé en verrouillant une instance balanceLock dédiée. L'utilisation de la même instance pour le verrouillage permet de garantir que le champ balance ne peut pas être mis à jour simultanément par deux threads qui tentent d'appeler les méthodes Debit ou Credit en même temps.