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

时间:2011-05-08 08:23:56

标签: c#

我是否需要声明一个静态Object并对其使用锁定,如

private static readonly Object padlock = new Object()

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

}

2 个答案:

答案 0 :(得分:5)

(顺便说一句,您的代码目前不会编译 - Readonly应为readonly,您需要为padlock提供类型。)

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

如果您以非线程安全的方式访问共享数据,通常只需要锁定。 (所有对该共享数据的访问权限都需要以线程安全的方式完成。)

话虽如此,我应该指出“线程安全”是一个非常含糊的术语。 Eric Lippert有一个关于它的great blog post ...而不是试图想出一个“一刀切”的方法,你应该考虑你想要保护的东西,你期待的场景等等

答案 1 :(得分:3)

乔是对的;你真的不清楚这里要问的是什么。我解释你的问题的方式是:

  

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

这个问题的答案是否定的,你不是必需这样做。但是,这样做是一个非常好的主意,所以即使你不是 ,你 应该这样做。

您可能会认为,我可以使用很多对象。如果我锁定的对象是引用类型,我可以使用它。或者我可以使用与包含类关联的Type对象。

锁定这些东西的问题是很难找到可能使用该东西作为锁的每一个可能的代码。因此,分析代码变得困难,以确保不会因锁定顺序问题而导致死锁。因此,您更有可能陷入僵局。拥有专用的锁定对象使其更容易;你知道该对象的每一次使用都是为了锁定的目的,然后你就可以理解这些锁中发生了什么。

如果您的appdomain中运行了不受信任的恶意代码,则尤其如此。锁定类型对象不需要特定权限;什么阻止恶意代码锁定所有类型,从不解锁它们?没什么,那是什么。