测试条件然后锁定然后重新测试条件是好的

时间:2011-02-18 00:43:21

标签: c# locking double-checked-locking

  

可能重复:
  Double-checked locking in .net

编辑:大量修改以澄清此问题与单身人士无关

我发现自己编写了这样的代码:

    if(resourceOnDiskNeedsUpdating)
    {
        lock(lockObject)
        {
            if(resourceOnDiskNeedsUpdating) // has a previous thread already done this?
                UpdateResourceOnDisk();
        }
    }
    return LoadResourceFromDisk();

UpdateResource()是一个缓慢的操作。 这种模式有意义吗? 还有更好的选择吗?

2 个答案:

答案 0 :(得分:4)

这称为“双重检查锁定”。

你需要一个记忆围栏才能使其正确。

请参阅Wikipedia's article on double checked locking in .NET

答案 1 :(得分:2)

我使用的替代方法是使用'volatile'关键字。 http://msdn.microsoft.com/en-us/library/x13ttww7%28v=vs.71%29.aspx