2013-06-03 108 views
2

我需要使用鎖(createPaletteLocker)嗎?我正在使用它,因爲我認爲這樣做可以避免在其他線程正在讀取時寫入ColorPaletteHandle.palettesList [type]。靜態類的靜態方法,這種方法線程安全嗎?

編輯1:字典只在靜態構造函數中設置。所以我不會再改變(添加/刪除),但它所保持的立場將從空變爲各自創建的調色板。

public static class ColorPaletteHandle 
{ 
    private static readonly object createPaletteLocker = new object(); 
    private static Dictionary<ColorPaletteType, ColorPalette> palettesList = null; 

    static ColorPaletteHandle() 
    { 
     palettesList = new Dictionary<ColorPaletteType, ColorPalette>(); 
     palettesList.Add(ColorPaletteType.Default, ColorPaletteHandle.defaultPalette); 
     palettesList.Add(ColorPaletteType.EdgesHighlight, ColorPaletteHandle.edgesHighlight); 
     palettesList.Add(ColorPaletteType.GrayScale, ColorPaletteHandle.grayScale); 
     palettesList.Add(ColorPaletteType.HeatMap, ColorPaletteHandle.heatMap); 
    } 

    /// <summary> 
    /// Gets a palette. 
    /// </summary> 
    /// <param name="type"></param> 
    /// <returns></returns> 
    public static ColorPalette GetPalette(ColorPaletteType type) 
    { 
     ColorPalette pal = null; 
     lock (ColorPaletteHandle.createPaletteLocker) 
     { 
      pal = ColorPaletteHandle.palettesList[type]; 
      if (pal == null) 
      { 
       ColorPaletteHandle.palettesList[type] = ColorPaletteHandle.CreatePalette(type); 
       pal = ColorPaletteHandle.palettesList[type]; 
      } 
     } 
     return pal; 
    } 

    //stuff... 
    } 
+0

看起來像標準的單一鎖定對我來說。沒有它,如果在第一次訪問給定類型時存在多個線程,則可能會遇到麻煩。 – 2013-06-03 21:00:25

+1

@ebyrob如果您試圖在同一時間添加兩個新值,它也可能[潛在地]破壞。 – Servy

回答

2

是這種方法是線程安全的,因爲只有一個線程可以同時修改palettesList,是的,如果你打算使用Dictionary

你確實需要的鎖,但,如果你在.NET 4級或以上,ConcurrentDictionary會更適合這個

+0

你似乎沒有回答他問的實際問題:「我是否需要使用鎖(createPaletteLocker)?」 – Servy

+0

@Servy沒有看到問題的「第二部分」,我將問題看作「靜態類上的靜態方法,此方法是否線程安全?」 :) – Jason

+0

謝謝你們兩位。我想我會保持鎖定,因爲類不會更改字典的數量,所以我不需要使用ConcurrentDictionary。但感謝您指出它,我不知道它。 – Pedro77

6

Dictionary類不旨在從多個線程訪問。除非您同步訪問權限,否則確實會導致問題。在lock聲明中,該方法沒有問題,但沒有。

甚至比使用lock更好的是使用ConcurrentDictionary來代替。它是專門設計用於同時從多個線程使用的字典。您可以將整個方法重構爲GetOrAdd

相關問題