我一直在使用这种模式来初始化类中的静态数据。对我来说,它看起来是线程安全的,但我知道线程问题有多么微妙。这是代码:
public class MyClass // bad code, do not use
{
static string _myResource = "";
static volatile bool _init = false;
public MyClass()
{
if (_init == true) return;
lock (_myResource)
{
if (_init == true) return;
Thread.Sleep(3000); // some operation that takes a long time
_myResource = "Hello World";
_init = true;
}
}
public string MyResource { get { return _myResource; } }
}
这里有漏洞吗?也许有一种更简单的方法可以做到这一点。
更新:共识似乎是静态构造函数是可行的方法。我使用静态构造函数想出了以下版本。
public class MyClass
{
static MyClass() // a static constructor
{
Thread.Sleep(3000); // some operation that takes a long time
_myResource = "Hello World";
}
static string _myResource = null;
public MyClass() { LocalString = "Act locally"; } // an instance constructor
// use but don't modify
public bool MyResourceReady { get { return _myResource != null; } }
public string LocalString { get; set; }
}
我希望这会更好。
您可以使用静态构造函数来初始化静态变量,C# 保证在每个 AppDomain 中仅调用一次。不确定你是否考虑过它们。
所以你可以阅读以下内容:http://msdn.microsoft.com/en-us/library/aa645612(VS.71).aspx http://msdn.microsoft.com/en-us/library/aa645612(VS.71).aspx(静态构造函数)
和这个:C# 静态构造函数线程安全吗? https://stackoverflow.com/questions/7095/is-the-c-static-constructor-thread-safe
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)