我确定我的头衔并不完美,所以让我清楚自己。
通过这篇文章:http://msdn.microsoft.com/en-us/magazine/jj863136.aspx,
void Print()
{
int d = _data; // Read 1
if (_initialized) // Read 2
Console.WriteLine(d);
else
Console.WriteLine("Not initialized");
}
为什么读取1只算作读数而不是写作?我的意思是,最后'_data'的内容被写为'd'。
我希望你明白我的要求。
答案 0 :(得分:1)
int d = _data;
确实是一个读写。但是写入是堆栈上的本地变量d
,并且对于那里的讨论不感兴趣。
当有多个线程访问同一个对象并因此访问相同的内存时,感兴趣的是成员变量_data
的读/写顺序。对于本地d
变量,每个线程都有自己的堆栈,并且在这些示例中没有关于访问d
的多线程问题。
本文讨论了_data
变量,而不是d
变量。每当有人读/写_data
时,这就是有趣的部分,就像多线程的内存重新排序是必须要注意的事情。 int d = _data
也写入d
完全无关紧要。
通过评论// Read 1
,暗示我们正在谈论_data
- 并且在该行代码上没有写_data
。