2013-06-03 75 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

相关问题