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

本文关键字:延迟 对象 创建 返回 函数调用 锁定 | 更新日期: 2023-09-27 18:19:25

可以解释当从多个线程调用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()时存在竞赛条件,但只有第一次。

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

这将产生对Obj()的两个调用将返回不同实例的效果。

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

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