2010-08-17 71 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; 
       } 
      } 
     } 
    }