2010-08-17 76 views
3

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

我有点担心,装箱/拆箱可能会造成一些问题......

private static object initialized = false; 

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

请注意,我不能只是做从主或其他一些单线程方面的初始化。

回答

4

你说得对 - 这是不行的,因为你正在重新分配你锁定的对象。

你可以用两个独立的成员来做到这一点 - 一个锁定对象只分配一次,然后是一个你可以读取或分配的布尔值(锁定后)。

您可能还想考虑一下singleton在这里是否合适。

+1

或者使用静态构造函数。或新的'懒惰'对象。 – 2010-08-17 03:16:10

1

有几个选项:

  1. 锁上一次分配的参考类型,如标记已经提及。
  2. 在静态构造函数上进行初始化,它保证只运行一次。 Con:想要进行初始化时很难控制。
  3. 如果可能的话,Lazy类,它是线程安全的。

所有3种方法也可用于创建单例。

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; 
       } 
      } 
     } 
    }