|
Le mot-clé verrouillage marque un bloc d’instructions comme zone critique en prenant un mutex pour un objet donné, en exécutant l’instruction, puis en relâchant le verrou.
L’instruction lock utilise essentiellement Monitor.Enter et Monitor.Exit, c’est-à-dire que Monitor.Enter (this) s’exécute lorsque lock(this) est exécuté, et Monitor.Exit (this) est exécuté à la fin de la coupelle curly. Quelle est sa signification ? Pour tout objet, la première partie de la mémoire est l’adresse de toutes les méthodes, et la seconde partie est un index. Il pointe vers un SyncBlock dans la zone SyncBlock Cache du CLR. Qu’est-ce que cela signifie ? C’est-à-dire que lorsque vous exécutez Monitor.Enter(Object), si la valeur d’indice de l’objet est négative, sélectionnez un SyncBlock dans le cache SyncBlock et placez son adresse dans l’index de l’objet. Cela complète le verrou marqué par objet, et les autres threads veulent effectuer à nouveau l’opération Monitor.Enter(objet), ce qui obtiendra un index avec un objet positif, puis attendre. Jusqu’à ce que l’indice devienne négatif, c’est-à-dire que le thread utilise Monitor.Exit(object) pour rendre l’index négatif. À quoi il faut prêter attention lorsque vous utilisez la serrure :
1. verrouillage ne peut pas verrouiller la valeur nulle Un objet peut pointer vers nulle, mais la valeur nulle n’a pas besoin d’être libérée. (Voir aussi : Comprendre le nul complet) 2. Lock ne peut pas verrouiller le type de chaîne, bien qu’il soit aussi un type de référence. Parce que le type de chaîne est « surélevé » par le CLR Cela signifie qu’il n’y a qu’une seule instance d’une chaîne donnée dans l’ensemble du programme, et que ce même objet représente ce texte dans tous les threads de tous les domaines d’application en cours. Ainsi, tant qu’un verrou est placé sur une chaîne contenant le même contenu n’importe où dans le processus applicatif, toutes les instances de cette chaîne dans l’application seront verrouillées. Il est donc préférable de verrouiller des membres privés ou protégés qui ne seront pas persistés. 3.verrouillage L’objet est la frontière mémoire d’un bloc programme 4. Le type de valeur ne peut pas être verrouillé, car l'« objet est libéré » en rouge dans le texte précédent, et le type de valeur n’est pas un type de référence 5.lock évite de verrouiller des types ou objets publics qui ne sont pas contrôlés par le programme. Par exemple, si l’instance est accessible au public, le verrouillage (ceci) peut poser problème car un code non contrôlé peut aussi verrouiller l’objet. Cela peut entraîner des blocages, où deux threads ou plus attendent de libérer le même objet. Le verrouillage des types de données publiques (par opposition aux objets) peut également poser des problèmes pour la même raison. Lors de l’utilisation de verrou (ceci), la valeur de la variable membre de classe peut être modifiée par la méthode qui n’est pas dans la zone critique
Scénario d’application : Il est souvent utilisé pour éviter des exceptions incertaines dans la valeur des variables publiques causées par des opérations multithread afin d’assurer la sécurité des opérations
|