41 votes

Pourquoi C# ne permet-il pas de verrouiller une valeur nulle ?

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?

58voto

Paul Betts Points 41354

Vous ne pouvez pas verrouiller sur une valeur nulle car le CLR n'a pas de place pour attacher le SyncBlock, ce qui permet au CLR de synchroniser l'accès à des objets arbitraires via Monitor.Enter/Exit (ce que lock utilise en interne )

30voto

Chris Shain Points 33569

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

6voto

Gian Paolo Points 476

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X