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

时间:2015-10-27 19:16:35

标签: c# locking

可以解释在从多个线程调用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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

第一次调用_obj == null时出现竞争条件,但第一次只有

想象一下,该方法是并行运行的,然后可以分配和返回两个不同的对象,但前提是第二个调用在第一个调用完成之前并在第一个调用之前通过_obj检查Obj()。 1}}。

这会导致对(1) if (_obj == null) (2) if (_obj == null) (2) _obj = new Object(); (2) return _obj; (1) _obj = new Object(); (1) return _obj; 的两次调用返回不同的实例。

运行示例:( n-thread)代码行

{{1}}