【发布时间】:2020-10-13 21:48:31
【问题描述】:
如果之前有人问过这个问题,请原谅我,因为我找不到合适的关键字来搜索它。因此,如果您对以下问题的关键字有任何建议,请告诉我。
所以问题是:假设我有一堂课
class Test
{
public int testProp;
}
当我做类似的事情时
var testInstance = new Test();
testInstance.testProp += 10;
testProp 的地址是否仍与 + 操作之前相同?当我尝试使用 Visual Studio 反汇编窗口时,我发现它似乎将新值复制到相同的地址(请在此处纠正我,因为我不熟悉汇编语言)。
我问是因为在多个线程访问该属性并同时增加其值的情况下
var list = new List<Task>();
for (var z = 0; z < 2000; z++)
{
list.Add(Task.Run(() =>
{
testInstance.testProp+=10;
}));
}
有时它会给我 20000,但有时只给我 19990 或更少,所以如果testProp 的地址被更改,我很困惑,如果不是,如何读取地址的值以减少总和在这种情况下超过 20000?
【问题讨论】:
-
变量的地址没有改变。存储在该地址的值会发生变化。
-
好吧 testProp 是
field不是属性,差别很大。实际上将field公开是一个大罪。解决问题的最简单方法是将public int testProp更改为public volatile int testProp。 -
@Legacy Code 是的,我知道,这只是我尝试过的一些快速示例代码。
-
@LegacyCode 只是在您声明此问题的所有地方都明确说明:不,
volatile不能解决此问题 -
@MarcGravell 我显然无法编辑我的评论以删除它...
标签: c# .net memory-management heap-memory