87 votes

lock (nouvel objet ()) - Culte du fret ou un "cas spécial de langage" fou?

Je suis l'examen du code écrit par un expert, et alors que des dizaines de drapeaux rouges ont déjà surgi, je ne peut pas envelopper la tête autour de l'extrait de code suivant:

private void foo()
{
    if (InvokeRequired)
    {
        lock (new object())
        {
            if (m_bar!= null)
                Invoke(new fooDelegate(foo), new object[] { });
        }
    }
    else
    {
        if(OnBazChanged != null)
            OnBazChanged();
    }
}

Qu'est-ce que le verrou(new object()) fais ici? Ne doit avoir aucun effet que ce soit, comme c'est toujours le verrouillage sur un autre objet, mais ce type de verrouillage est persistant dans le code, même en non-copier-collé des pièces. Est-ce certains cas spécial dans le langage C# qui est compilé pour quelque chose que je ne sais pas ou est le programmeur a simplement adopté certains de culte du cargo qui s'est passé à travailler il y a quelques temps?

82voto

cjk Points 27463

Je ne serais pas surpris si c'était quelqu'un qui a vu ceci:

 private readonly object lockObj = new object();

private void MyMethod()
{
    lock(lockObj)
    {
        // do amazing stuff, so amazing it can only run once at a time
        // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
    }
}
 

et pensait qu'il pourrait réduire le nombre de lignes.

Je serais très inquiet si c'était le cas cependant ...

15voto

JleruOHeP Points 3322

Ici est la même question, et la réponse:

Serrures assurer l'exclusion mutuelle -- pas plus d'un thread peut retenir l' verrou en même temps. La serrure est identifiée à un objet spécifique exemple. Vous êtes à la création d'un nouvel objet de verrouillage de tous les temps et de vous n'ont aucun moyen d'informer toute autre thread verrou sur exact même instance d'objet. Par conséquent, votre installation de fermeture est inutile.

2voto

benmmurphy Points 1609

C'est probablement inutile. Mais il y a une chance inespérée de créer une barrière de mémoire. Vous ne savez pas si c # verrouille ou ne conserve pas la sémantique de classement du verrou.

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