静态类上的静态方法,是该方法线程安全的
本文关键字:方法 线程 安全 静态方法 静态类 | 更新日期: 2023-09-27 18:16:34
我需要使用锁(createPaletteLocker(吗?我使用它是因为我认为这样做可以避免在其他线程读取它时写入ColorPaletteHandle.palettesList[type]。
EDIT 1:字典仅在静态构造函数处设置。因此,我将不再更改(添加/删除(,但它所保持的立场将从null更改为各自创建的调色板。
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...
}
Dictionary
类不是为从多个线程访问而设计的。这样做确实会导致问题,除非同步访问。有了lock
语句,方法就可以了,没有它就不行。
甚至比使用lock
更好的是使用ConcurrentDictionary
。它是一个专门设计用于同时从多个线程使用的字典。您可以将整个方法重构为对GetOrAdd
的一次调用。
是的,这个方法是线程安全的,因为一次只有一个线程可以修改palettesList
,是的,如果你打算使用Dictionary
,你确实需要锁
但是,如果您使用的是.NET 4或更高版本,ConcurrentDictionary将更适合此