多线程访问并发字典和内存模型的值

时间:2018-03-08 14:34:44

标签: c# multithreading memory thread-safety

我正在寻找有人在这种代码情况下验证我对并发和内存模型的理解。

public static class ExampleClass
{
    private static ConcurrentDictionary<int, TimeSpan> DeviceThrottles { get; set; } = new ConcurrentDictionary<int, TimeSpan>();

    public static void ExampleFunction(int deviceId)
    {
        TimeSpan timedelay = DeviceThrottles[deviceId];

        if (timedelay.Seconds < 10)
        {
            DeviceThrottles[deviceId] = new TimeSpan(days: 0, hours: 0, minutes: 0, seconds: 10);
        }
    }
}

应用程序运行多个线程,可以调用ExampleFunction。鉴于以下情况。

线程1调用ExampleFunction(1)timedelay只有5秒,因此DeviceThrottles[deviceId]设置为10秒的新TimeSpan。

稍后,线程2调用ExampleFunction(1)。是否有可能本地线程缓存仍然只有5秒的timedelay?我的理解是ConcurrentDictionary的目的只是集合的线程安全,而不是维护跨线程对象的最新内存。

如果我的理解是正确的,那么应该将代码修改为以下代码,以确保TimeSpan值在线程中是最新的。

public static void ExampleFunction(int deviceId)
{
    lock (lockObj)
    {
        TimeSpan timedelay = DeviceThrottles[deviceId];

        if (timedelay.Seconds < 10)
        {
            DeviceThrottles[deviceId] = new TimeSpan(days: 0, hours: 0, minutes: 0, seconds: 10);
        }
    }
}

使用锁定,似乎并发字典失去了吸引力。

0 个答案:

没有答案