使用锁定即时更新字段

时间:2016-11-29 05:34:35

标签: c# locking

我有一些代码可以访问我想要定期刷新内容的字典。包含对象在多个线程之间共享。

我不太了解锁定,但在我脑海中,我想到两个线程击中它,第一个在下一个之前运行完成。如果锁的主体更新共享值作为第一个更新它的线程然后所有挂起的线程将执行相同操作,这似乎是一件相当糟糕的事情。这是我对它是如何工作的理解。

所以它有点依赖于场景,但在我的情况下,我提出了这个

if (DateTimeOffset.Now.Subtract(_lastResolve) > TimeSpan.FromMinutes(2))
            {
                var copy = _configCache;
                lock (_lock)
                {
                    if (copy == _configCache)
                    {
                        var t = ResolveSettings();
                        t.Wait();
                        _configCache = t.Result;
                    }
                }
            }

return _configCache;

因此,在锁定之前,它会创建我们正在更新的字典的ref副本,并在进入锁体时确认副本ref仍然是针对同一个字典。

所以我的问题是双重的,我对锁定行为的理解是正确的,其次是我处理这个特定问题的方法是什么声音?

由于

1 个答案:

答案 0 :(得分:2)

这称为双重检查锁定,如下所述。 G。在MSDNSO上使用单身模式。

要获得与引用代码更兼容的内容,您可能已在锁定主体中再次检查_lastResolve。但由于日期时间操作相当昂贵,指针的分配和检查可能是一种更轻量级的方法来完成所需的操作。

您应该考虑将_configCache声明为volatile,以防止编译器进行不期望的优化。

希望这有帮助。