我需要使用鎖(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...
}
看起來像標準的單一鎖定對我來說。沒有它,如果在第一次訪問給定類型時存在多個線程,則可能會遇到麻煩。 – 2013-06-03 21:00:25
@ebyrob如果您試圖在同一時間添加兩個新值,它也可能[潛在地]破壞。 – Servy