msdn杂志文章https://msdn.microsoft.com/en-us/magazine/jj863136.aspx
中有一个例子class BoxedInt
{
public int Value { get; set; }
}
class LazyInit
{
volatile BoxedInt _box;
public int LazyGet()
{
var b = _box; // Read 1
if (b == null)
{
lock(this)
{
b = new BoxedInt();
b.Value = 42; // Write 1
_box = b; // Write 2
}
}
return b.Value; // Read 2
}
}
据说:
在此示例中,LazyGet始终保证返回“42”。但是, 如果_box字段不易变,则允许LazyGet 返回“0”有两个原因:读取可以重新排序,或者 写入可以重新排序。
我理解为什么当"写1"时,函数可以返回0。和"写2"重新排序,但是如果重新排序读取,假设写入没有重新排序,它怎么能返回0。考虑到存在数据依赖性,如何对读取进行重新排序?