c# - lock(objlocker) 是否使该对象在应用程序范围内线程安全?静态成员是否自动线程安全?

标签 c# multithreading thread-safety static-members

当您锁定一个对象时,该对象是否在整个应用程序中都被锁定了?

例如,C# 3.0 中的这个片段在 N​​utshell 第 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/

相关文章:

c++ - std::atomic 的正确用法

c# - 如何在某些情况下从数据表中选择全部?

c# - .Net - 如何创建实现接口(interface)的 UserControl?负载控制错误

Java并行处理数组

Java多线程程序卡在对 map 的访问上

java - Java 中非最终对象同步的正确方法

c# - Oracle ODP.NET 游标泄漏?

c# - 同一应用程序中的多个静态变量范围?

c# - 捕获线程未处理的异常

c++ - boost shared_ptr <XXX> 线程安全吗?