Joh*_*ohn 1 c# multithreading static-members thread-safety
当你锁定一个对象时,该对象是否在整个应用程序中被锁定?
例如,Cuts 3.0中的这个片段在Nutshell Section 19.6.1"Thread Safety and .NET Framework Types"中:
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);
}
Run Code Online (Sandbox Code Playgroud)
第一次锁定:
lock (list)
list.Add ("Item " + list.Count);
Run Code Online (Sandbox Code Playgroud)
防止其他线程访问:
lock (list) items = list.ToArray( );
Run Code Online (Sandbox Code Playgroud)
或者都可以同时执行?
CLR会自动使您的静态方法线程安全吗?或者这取决于开发人员?
谢谢,约翰
另外需要注意的是静态构造函数是由运行时以线程安全的方式执行的.如果要创建单例并将其声明为:
public class Foo
{
private static Foo instance = new Foo();
public static Foo Instance
{
get { return instance; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后它将是线程安全的.但是,如果你实例化一个新的Foo 内的实例吸气,那么你就需要编写自己的线程安全(即锁定对象)