Muss ich ein statisches Objekt deklarieren und eine Sperre für es verwenden wie
private static readonly Object padlock = new Object()
public static Test()
{
lock(padlock) {
// Blah Blah Blah
}
}
Muss ich ein statisches Objekt deklarieren und eine Sperre für es verwenden wie
private static readonly Object padlock = new Object()
public static Test()
{
lock(padlock) {
// Blah Blah Blah
}
}
(Ihr Code ließe sich übrigens derzeit nicht kompilieren - Readonly
sollte sein readonly
und Sie müssen die padlock
einen Typ).
Das hängt davon ab, was Sie in der Methode tun. Wenn die Methode keine gemeinsamen Daten verwendet oder sie auf eine Weise verwendet, die bereits sicher ist, dann ist alles in Ordnung.
Im Allgemeinen müssen Sie nur sperren, wenn Sie auf gemeinsam genutzte Daten auf eine nicht Thread-sichere Weise zugreifen. (Und todo Der Zugriff auf diese gemeinsamen Daten muss thread-sicher erfolgen).
Abgesehen davon sollte ich darauf hinweisen, dass "threadsicher" ein ziemlich vager Begriff ist. Eric Lippert hat eine toller Blogbeitrag Anstatt zu versuchen, eine "Einheitsgröße für alle" zu entwickeln, sollten Sie darüber nachdenken, wogegen Sie sich schützen wollen, mit welchen Szenarien Sie rechnen usw.
Jon hat Recht; es ist wirklich nicht klar, was Sie hier fragen. Ich würde Ihre Frage wie folgt interpretieren:
Wenn ich einen gemeinsam genutzten Zustand habe, der durch Sperren thread-sicher gemacht werden muss, muss ich dann ein privates statisches Objekt als das Sperrobjekt deklarieren?
Die Antwort auf diese Frage lautet: Nein, Sie sind nicht erforderlich zu tun. Dies ist jedoch eine wirklich gute Idee so dass Sie sollte tun Sie dies auch, wenn Sie nicht erforderlich .
Man könnte meinen, es gibt viele Objekte, die ich verwenden könnte. Wenn das Objekt, das ich sperre, ein Referenztyp ist, könnte ich es verwenden. Oder ich könnte das Type-Objekt verwenden, das mit der enthaltenen Klasse verbunden ist.
Das Problem mit diesen Dingen als Schlösser ist, dass es schwierig wird, jedes mögliche Stückchen Code aufzuspüren, das das Ding als Schloss benutzen könnte. Daher wird es schwierig, den Code zu analysieren, um sicherzustellen, dass es keine Deadlocks aufgrund von Problemen mit der Sperrreihenfolge gibt. Daher ist die Wahrscheinlichkeit von Deadlocks viel größer. Ein dediziertes Sperrobjekt macht es viel einfacher; Sie wissen, dass jede einzelne Verwendung dieses Objekts dem Zweck des Sperrens dient, und Sie können dann verstehen, was innerhalb dieser Sperren vor sich geht.
Dies gilt insbesondere dann, wenn Sie nicht vertrauenswürdigen, feindlichen Code in Ihrer Anwendungsdomäne ausführen lassen. Das Sperren eines Typobjekts erfordert keine besonderen Berechtigungen; was hält feindlichen Code davon ab, alle Typen zu sperren und nie wieder zu entsperren? Nichts, das ist es.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.