我正在寻找有人在这种代码情况下验证我对并发和内存模型的理解。
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);
}
}
}
使用锁定,似乎并发字典失去了吸引力。