C# 如何在静态方法中确保线程安全

C# 如何在静态方法中确保线程安全,c#,C#,我需要声明一个静态对象并像这样对它使用锁吗 private static readonly Object padlock = new Object() public static Test() { lock(padlock) { // Blah Blah Blah } } (顺便说一下,您的代码当前不会编译-Readonly应该是Readonly,您需要为挂锁提供一个类型。) 这取决于你在这个方法中做了什么。如果该方法不使用任何共享数据,或者以已经安全的方式

我需要声明一个静态对象并像这样对它使用锁吗

private static readonly Object padlock = new Object()

public static Test()
{
   lock(padlock) {
          // Blah Blah Blah
   }

}
(顺便说一下,您的代码当前不会编译-
Readonly
应该是
Readonly
,您需要为
挂锁提供一个类型。)

这取决于你在这个方法中做了什么。如果该方法不使用任何共享数据,或者以已经安全的方式使用它,那么您就可以了

通常,只有在以非线程安全的方式访问共享数据时,才需要锁定。(所有对共享数据的访问都需要以线程安全的方式完成。)


话虽如此,我应该指出,“线程安全”是一个相当模糊的术语。Eric Lippert对此有自己的看法。。。不要试图提出“一刀切”的方法,你应该考虑你试图防范的是什么,你预期的是什么情况等等。

乔恩是对的;真的不清楚你在问什么。我对你的问题的解释是:

如果我有一些共享状态需要通过锁定来实现线程安全,那么我是否需要声明一个私有静态对象作为锁对象

这个问题的答案是否定的,你不需要这样做。然而,这样做确实是一个好主意,所以即使不需要你,你也应该这样做

你可能会想,我可以用很多东西。如果我锁定的对象是引用类型,我可以使用它。或者我可以使用与包含类关联的类型对象

这些东西作为锁的问题是,很难找到可能将其用作锁的每一位代码。因此,很难分析代码以确保没有由于锁顺序问题而导致的死锁。因此,您更有可能出现死锁。有一个专用的锁对象使它更容易;您知道该对象的每一次使用都是为了锁定,然后您就可以了解这些锁中发生了什么


如果您曾经在appdomain中运行过不受信任的恶意代码,这一点尤其正确。锁定类型对象不需要特定权限;是什么阻止恶意代码锁定所有类型而从不解锁它们?没什么,就是这样

根据评论编辑问题