Я видел в книге mprss эту рекомендацию синглтона (частичный код прилагается):
public static Singleton GetSingleton()
{
if (s_value != null)
return s_value;
Monitor.Enter(s_lock);
if (s_value == null)
{
Singleton temp = new Singleton();
Interlocked.Exchange(ref s_value, temp);
}
Monitor.Exit(s_lock);
return s_value;
}
Мы добавляем две строки кода во второй блок оператора if вместо простого написания:
s_value = new Singleton();
это должно обработать ситуацию, когда второй поток входит в метод и находит s_value != null
, но не инициализирован.
Мой вопрос, можем ли мы вместо этого написать на втором блоке if:
{
Singleton temp = new Singleton();
s_value = temp; // instead of Interlocked.Exchange(ref s_value, temp);
}
Так что теперь функция:
public static Singleton GetSingleton()
{
if (s_value != null)
return s_value;
Monitor.Enter(s_lock);
if (s_value == null)
{
Singleton temp = new Singleton();
s_value = temp;
}
Monitor.Exit(s_lock);
return s_value;
}
Наверное, нет, потому что они им не пользуются.
У кого-нибудь есть предложения?
Возможно, что svalue может содержать неинициализированный?
Значение может быть создано сразу после полной инициализации temp (могу я ошибаться).
Если я ошибаюсь, можете ли вы привести пример, это неправильно?
может ли компилятор создавать другой код?