锁定从函数调用返回的延迟创建的对象
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;
能否解释一下从多线程调用 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;