在多线程C#程序中执行一次初始化

时间:2010-08-17 03:00:12

标签: c# multithreading

在多线程程序中执行一次初始化时,下面的代码段是否“安全”?

我有点担心拳击/拆箱可能会引起一些问题......

private static object initialized = false;

public static void Initialize()
{
  lock (initialized)
  {
    if ((bool)initialized == false)
    {
      DoInitialization();
      initialized = true;
    }
  }
}

请注意,我不能只从Main或其他单线程上下文进行初始化。

3 个答案:

答案 0 :(得分:4)

你是对的 - 因为你正在重新分配你要锁定的对象,所以不会起作用。

您可以使用两个单独的成员执行此操作 - 锁定的对象仅分配一次,然后是您可以读取或分配的布尔值(锁定后)。

您可能还想考虑singleton是否合适。

答案 1 :(得分:3)

尝试double-checked locking

    private static volatile bool initialized = false;
    private static object syncObject = new object();
    public static void Initialize() {
        if (!initialized) {
            lock (syncObject) {
                if (!initialized) {
                    DoInitialization();
                    initialized = true;
                }
            }
        }
    }

答案 2 :(得分:1)

一些选择:

  1. 锁定曾经分配过的引用类型,正如Mark所说。
  2. 初始化静态构造函数,保证只运行一次。 Con:很难控制何时进行初始化。
  3. 如果可能的话,Lazy类是线程安全的。
  4. 所有3种方法也可用于创建单身人士。