В прошлом я не раз пользовался так называемым double-checked locking для ускорения инициализации разделяемой неизменяемой переменной. Т.е. вместо кода вида
private SomeClass someProperty = null;
public SomeClass SomeProperty
{
get
{
lock (this)
{
if (someProperty == null)
someProperty = new SomeClass();
return someProperty;
}
}
}
использовал код вида
private SomeClass someProperty = null;
public SomeClass SomeProperty
{
get
{
if (someProperty == null)
{
lock (this)
{
if (someProperty == null)
someProperty = new SomeClass();
}
}
return someProperty;
}
}
Однако в
статье «The “Double-Checked Locking is Broken” Declaration» (на английском) объясняется, почему так делать нельзя.
Как выяснилось, в C# достаточно описать someProperty как volatile и всё будет работать.