Нет, блокировка не будет препятствовать доступу, который не проходит через блокировку того же ресурса. Поскольку рефлексия не пройдет через lock
, вы получите условия гонки.
Вот (немного отличается от вашего кода, но, тем не менее, делая то же самое), что я имею в виду →
void SetOne(){
lock (_sync){
critical_element = SOME_VALUE;
}
}
void SetTwo(){
critical_element = SOME_ANOTHER_VALUE;
}
Выше определенно есть условия гонки.
Вот мое понимание вопроса ОП. Я думаю, что OP хочет использовать шаблон Singleton
, и это очень хорошая и поточно-ориентированная реализация. Вам также не нужно иметь дело с замками. Однако некоторые плохие пользователи могут по-прежнему устанавливать поле поддержки, используя отражение.
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance { get { return lazy.Value; } }
private Singleton(){}
}