gpt4 book ai didi

c# - 当在方法中枚举静态变量时将其设置为 null 会发生什么

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:39 26 4
gpt4 key购买 nike

给定以下类并假设打印列表需要很长时间才能运行,如果线程 1 调用 PrintList() 然后在它运行时线程 2 调用 ClearList 会发生什么情况?

我们并没有修改集合,只是将引用更改为指向堆中的不同位置。那么枚举是否继续工作?如果是这样,这是因为 _someList 引用的副本被放入该方法的堆栈帧中吗?

public class foo()
{

private static List<string> _someList;

public void ClearList()
{
_someList = null;
}

public void PrintList()
{
foreach(var item in _someList)
{
Console.Print(item);
}
}

}

最佳答案

两件非常可预测的事情之一将会发生。在某个时间点,第一个线程会将变量 _someList 计算为其值,即对列表的引用。如果在第二个线程清除它之前发生这种情况,那么它将遍历该列表并打印结果。如果第二个线程恰好在进入 foreach 循环之前清除了列表,那么您将得到空引用异常。

请注意,读取和写入引用类型的变量是可观察到的原子性,因此我们知道将变量设置为 null 不会导致引用无效;第一个线程将观察原始引用或 null,没有“读取垃圾引用”的可能性。

关于c# - 当在方法中枚举静态变量时将其设置为 null 会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26067522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com