Недавно я нашел эту статью , в которой объясняется, как реализовать thread safe singleton pattern
в C #.Однако мне интересно, насколько важно сделать ваш синглтон-поток безопасным, что и как опасно, если ваш синглтон-класс не потокобезопасен.Рассмотрим очень простую, не поточно-ориентированную реализацию одноэлементного шаблона:
public class ThreadNotSafeSingleton
{
public static ThreadNotSafeSingleton Instance
{
get
{
if (_instance == null)
{
_instance = new ThreadNotSafeSingleton();
}
return _instance;
}
}
private static ThreadNotSafeSingleton _instance;
private ThreadNotSafeSingleton()
{
}
}
Теперь, скажем, из-за того, что этот код не является потокобезопасным, два потока будут вводить эту строку кода _instance = new ThreadNotSafeSingleton();
.В этом случае первый поток инициализирует поле _instance
, а затем второй снова инициализирует поле _instance
, в любом случае в результате в вашем приложении будет существовать один _instance
.
Так в чем же дело?Я знаю, что если у вас более сложный код, а ваш конструктор выполняет какой-то другой код, который может не быть потокобезопасным, это может быть опасно.Но есть ли проблемы с безопасностью без потоков, если ваш синглтон так прост?