当您锁定一个对象时,该对象是否在整个应用程序中都被锁定了?
例如,C# 3.0 中的这个片段在 Nutshell 第 19.6.1 节“线程安全和 .NET Framework 类型”中:
static void AddItems( )
{
for (int i = 0; i < 100; i++)
lock (list)
list.Add ("Item " + list.Count);
string[] items;
lock (list) items = list.ToArray( );
foreach (string s in items) Console.WriteLine (s);
}
是否第一次锁定:
lock (list)
list.Add ("Item " + list.Count);
阻止另一个线程访问:
lock (list) items = list.ToArray( );
还是可以同时执行?
CLR 会自动使您的静态方法成为线程安全的吗?或者这取决于开发人员?
谢谢, 约翰
最佳答案
另一件需要注意的事情是静态构造函数是由运行时以线程安全的方式执行的。如果您正在创建单例并将其声明为:
public class Foo
{
private static Foo instance = new Foo();
public static Foo Instance
{
get { return instance; }
}
}
那么它将是线程安全的。但是,如果您在 Instance getter inside 实例化一个新的 Foo,那么您将需要编写自己的线程安全(即锁定对象)
关于c# - lock(objlocker) 是否使该对象在应用程序范围内线程安全?静态成员是否自动线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274344/