静态变量生存期和应用程序池回收
本文关键字:程序池 应用程序 应用 变量 生存期 静态 | 更新日期: 2024-10-30 16:53:26
我了解与应用程序(控制台/窗口)相关的静态变量的生存期,但我不确定在Web应用程序(asp.net,mvc,web API等)的上下文中是否理解它们的生存期。
据我了解,当 IIS 回收应用程序池时,静态变量将重置为其类型的默认值(积分 = 0,引用类型 = null 等),但我想知道内联初始值设定项是否在回收后重新初始化,或者无论如何都会始终分配类型默认值?
示例:
// example 1
static class StaticRandom
{
private static Random rng = new Random();
}
在上面,静态字段 rng 在回收后第一次调用时是否会重新初始化为新的 Random()?还是我需要在尝试使用该变量之前实现空检查,例如:
// example 2
static class StaticRandom
{
private static Random rng = null;
public static Next()
{
if (rng == null)
rng = new Random();
return rng.Next();
}
}
我假设在 IIS 回收后,示例 1 中的 rng 变量在像示例 2 中一样重新初始化之前将为空是否正确?
注意:我完全了解上面示例中的线程安全问题,这只是一个快速示例来说明我的问题。在上述想法的真实场景中,我将实现适当的锁定模式。
好的,所以忍不住,做了一个快速测试。
这与您的示例 1 几乎相同,除了页面输出,所以我可以在不附加到进程的情况下执行此操作,
它证实了我的想法 - 静态将被重置为内联初始化值。