Блокировка предотвращает изменения, сделанные с помощью отражения - PullRequest
0 голосов
/ 15 ноября 2018

Предположим, класс SomeClass с полем private static, как это.Доступ к этому полю синхронизируется с помощью lock.

private static SomeClass _instance
private static object _sync = new object();

public static SomeClass Instance 
{
    get 
    {
        lock (_sync)
        {
            if (_instance == null)
            {
                _instance = Create();
            }
            return _instance;   
        }
    }
}

Когда другой код из другого потока попытается установить значение этой переменной, например, null, используя отражение , lock предотвратит это и позволит вызову отражения вызватьподождать, пока блокировка не будет снята?

Например, что-то вроде этого:

Type type = typeof(SomeClass);
string fieldName = "_instance";
object value = null;
FieldInfo field = type.GetField(fieldName, true);
field.SetValue(null, value);

1 Ответ

0 голосов
/ 16 ноября 2018

Нет, блокировка не будет препятствовать доступу, который не проходит через блокировку того же ресурса. Поскольку рефлексия не пройдет через 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(){}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...