2010-06-02 4 views

Répondre

7

Non, ce ne sera pas le cas. A partir de la spécification C# (l'accent est à moi):

Une déclaration de verrouillage de la forme lock (x) ... où x est une expression d'un type de référence , est précisément équivalent à

System.Threading.Monitor.Enter(x); 
try { 
    ... 
} 
finally { 
    System.Threading.Monitor.Exit(x); 
} 

sauf que x est seulement évalué une fois.

Étant donné que x n'est pas réévalué, le verrou sera libéré.

+0

Le mot clé lock est un sucre syntaxique. Si vous étiez en train de coder en C++ géré avec .net framework 1.1, vous auriez dû verrouiller la façon dont João a spécifié. –

+0

Directement sur place Joao. Je vous remercie. –

2

Ne faites pas cela. Envisagez d'utiliser un objet séparé entièrement pour conserver l'état du verrou, pas nécessairement l'objet que vous souhaitez protéger dans l'instruction lock. Je vous écris souvent du code (ok, pas souvent) comme ceci:

private static readonly object _locker = new object(); 
private static MyObject _object; 
... 

lock (_locker) 
{ 
    ... 
    _object = new MyObject(); 
    ... 
} 

Il implique une sorte complètement différent du flux de programme que ce que vous regardez. lock() définit une section critique dans le code - vous ne l'utilisez pas comme un mécanisme de sécurité de thread polyvalent pour n'importe quel type d'objet (ce que je pense que votre intention est dans votre code?)

+0

Et déclarer '_locker' comme' readonly' afin qu'il ne puisse pas être accidentellement ré-assigné. – LukeH

+0

Excellente idée. Edité en conséquence. –

+0

J'aimerais pouvoir créer un objet d'état sans compliquer les choses. –

2

I Supposons qu'il conserve le verrou sur l'instance MyObject qui a été définie sur _locker lorsque lock a été appelée, c'est-à-dire qu'il conserve le verrou sur l'instance d'origine de _locker, et non sur l'instance MyObject nouvellement créée. Dans le code suivant, le verrou sera conservé sur MyObject("OriginalInstance") lorsque le lock est appelé pour la première fois. Lorsqu'il est appelé la deuxième fois, il se verrouille sur MyObject("NewInstance"). Par conséquent, le thread suivant peut entrer dans la section critique sans problèmes car la nouvelle instance n'est pas verrouillée.

Quoi qu'il en soit, faire des choses comme ça est généralement considéré comme une mauvaise pratique. Voir MSDN pour quelques conseils sur la façon d'utiliser lock.

+0

Eh bien ... c'est une mauvaise pratique en effet. Je dois trouver des moyens d'empêcher la réinstanciation de se produire. –

+0

Déclarez la variable comme 'readonly', comme déjà mentionné par d'autres ici. – gehho

Questions connexes