Во-первых, ваш точный код, как опубликовано, не работает.Это не является синтаксически правильным (фигурные скобки не сбалансированы), и есть два открытых члена Singleton.Instance.Я предполагаю, что ваш оригинальный код был таким:
public sealed class Singleton
{
private static Singleton _instance { get; set; }
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (_instance == null)
Instance = new Singleton();
return _instance;
}
}
}
Проблема, вероятно, связана с многопоточностью.То есть, пока один из потоков вызывает new Singleton()
, другой пытался получить Singleton.Instance
, который, в свою очередь, вызывал другой new Singleton()
.
Вам следует либо использовать там двойную проверку блокировки:
public sealed class Singleton
{
private static Singleton _instance { get; set; }
private Singleton()
{
}
public static Singleton Instance
{
get
{
if (_instance == null)
lock (typeof(Singleton))
if (_instance == null)
{
var instance = new Singleton();
_instance = instance;
}
return _instance;
}
}
}
или, что намного проще,
public sealed class Singleton
{
public static readonly Singleton _instance = new Singleton();
private Singleton()
{
}
}