2016-11-08 1 views
0

Sagen wir, wir wollen Gewindesynchronisation erreichen und wir verwenden dafür die Sperre. Aber wenn eine Frage gestellt wird, ist die Sperre auf das Objekt oder auf die Referenz, Wie beantworten wir diese Frage?C# Objekt oder Referenz sperren? Wie antwortest du das?

private static readonly object doSomethingLock = new object(); 
public static void DoSomething (SomeObject o) 
{ 
    lock(doSomethingLock) 
    { 
     o.Update(); 
     // etc.... 
    } 
} 
+2

Sie benötigen immer ein Objekt, um den Sperrstatus zu speichern. Die Verwendung eines Objekts erfordert immer die Verwendung einer Referenz. Sie beantworten die Frage mit den Worten: "Warum fragst du? Es ist keine sinnvolle Frage!" –

+0

Sie können niemals mehrere verschiedene Referenzen auf dasselbe Objekt haben, und die gleiche Referenz wird sich nie auf verschiedene Objekte beziehen, so dass Sie niemals einen Unterschied zwischen dem Sperren auf der Referenz oder dem Sperren auf dem Objekt, auf das verwiesen wird, beobachten können. Was auch immer die Implementierung tut, Sie können es nie von der anderen unterscheiden. – Servy

Antwort

5

Das Schloss ist auf dem Objekt. Ihr Code ist an diesem Code-Äquivalent:

private static readonly object doSomethingLock = new object(); 
public static void DoSomething (SomeObject o) 
{ 
    var sameObject = doSomethingLock; 
    lock(sameObject) 
    { 
     o.Update(); 
     // etc.... 
    } 
} 
+0

Dies ist nicht wahr, das Objekt ist nicht gesperrt, Sie können auf das Objekt in einem anderen Thread zugreifen und Operationen damit ausführen. – mybirthname

+0

@mybirthname Ja, Sie können auf das Objekt in einem anderen Thread zugreifen und Operationen darauf ausführen, aber das ändert nichts daran, dass das Objekt tatsächlich gesperrt ist. Die Semantik eines Objekts, das gesperrt wird, bedeutet einfach, dass ein anderer Thread nicht auch eine Sperre dieses Objekts erhalten kann, nicht dass er nicht auf das Objekt zugreifen oder dieses mutieren kann. – Servy

+0

@mybirthname, ich denke, wir interpretieren die Frage des OP auf zwei verschiedene Arten. Das Problem kann nur einer der Terminologie sein. Leider kann ich keine gute Sprache finden, um meinen Standpunkt zu klären. Servy hat einen besseren Job gemacht als ich wahrscheinlich. – adv12

2

Das Schloss ist auf die Verwendung dieses Objekts in dieser statischen Methode, nicht auf das Objekt global.

Wenn ein anderer Thread versucht, diese Methode aufzurufen, wird er blockiert, bis der erste Thread seinen Aufruf beendet hat.

Es wird nicht eine andere Methode stoppen, die auf dieses Objekt an anderer Stelle in Ihrem Code zugreift, aber solange der einzige Zugriff auf das Objekt innerhalb der Sperre ist, entspricht es dem Sperren des Objekts.

+0

Ich wusste das nicht. Danke, dass ich das herausgebracht habe. Ich habe einen einfachen Test gemacht, um es zu überprüfen. – mybirthname

+0

Sie sperren keine Methoden, Sie sperren Objekte. Ja, es stimmt, dass wenn Sie das Objekt sperren, es nicht verhindert, dass andere Threads auf es zugreifen, sondern auch versuchen, es zu sperren, aber das ändert nichts an der Tatsache, dass Sie immer noch Objekte sperren. – Servy

Verwandte Themen