Я использовал этот шаблон для инициализации статических данных в своих классах. Для меня это выглядит потокобезопасно, но я знаю, как могут возникать проблемы с тонкой резьбой. Здесь код:
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; } }
}
Здесь есть какие-то отверстия? Возможно, есть более простой способ сделать это.
UPDATE: Консенсус, похоже, заключается в том, что статический конструктор - это путь. Я придумал следующую версию, используя статический конструктор.
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; }
}
Я надеюсь, что это лучше.