C# n'autorise pas le verrouillage sur une valeur nulle. Je suppose que je pourrais vérifier si la valeur est nulle ou non avant de la verrouiller, mais parce que je ne l'ai pas verrouillée, un autre thread pourrait arriver et rendre la valeur nulle ! Comment puis-je éviter cette condition de course?
Réponses
Trop de publicités?Verrouiller une valeur qui n'est jamais nulle, par exemple
Object _lockOnMe = new Object();
Object _iMightBeNull;
public void DoSomeKungFu() {
if (_iMightBeNull == null) {
lock (_lockOnMe) {
if (_iMightBeNull == null) {
_iMightBeNull = ... whatever ...;
}
}
}
}
Faites également attention à éviter cette condition de course intéressante avec le verrouillage à double contrôle : Garanties du modèle de mémoire dans le verrouillage à double contrôle
Il y a deux problèmes ici :
Tout d'abord, ne verrouillez pas un objet null
. Cela n'a pas de sens car comment deux objets, tous les deux null
, peuvent-ils être différenciés ?
Deuxièmement, pour initialiser en toute sécurité une variable dans un environnement multithread, utilisez le modèle de verrouillage à double vérification :
if (o == null) {
lock (lockObj) {
if (o == null) {
o = new Object();
}
}
}
Cela garantira qu'un autre thread n'a pas déjà initialisé l'objet et peut être utilisé pour implémenter le modèle Singleton.