锁定从函数调用返回的延迟创建的对象
本文关键字:延迟 对象 创建 返回 函数调用 锁定 | 更新日期: 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;