锁定从函数调用返回的延迟创建的对象

Locking on lazily created object returned from a function call

能否解释一下从多线程调用 Increment 时,以下代码是否和为什么不能按预期工作?根据测试,它似乎有效,但对我来说仍然有问题。

class Test
{
    public int Value;      

    private object _obj;

    private object Obj()
    {
        if(_obj == null)
        {
            _obj = new object();
        }
        return _obj
    }

    public void Increment()
    {
        lock(Obj())
        {
             Value = Value + 1;
        }
    }
}

第一次调用 Obj() 时存在竞争条件,但 第一次调用。

假设该方法是 运行 并行,那么可能会分配两个不同的对象并 returned,但前提是第二次调用在第一个调用完成并通过 _obj == null 在第一个赋值之前检查 _obj.

这会导致对 Obj() 的两次调用会 return 不同的实例。

示例运行:(n线程)代码行

(1) if (_obj == null)
(2) if (_obj == null)
(2)   _obj = new Object();
(2) return _obj;
(1)   _obj = new Object();
(1) return _obj;