Блокировка, если условие - PullRequest
1 голос
/ 21 марта 2011

У меня есть проблема, когда мне нужно вызвать поточно-безопасный метод (то есть тот, который использует внутреннюю блокировку), если условие истинно. Проверяемое мной условие считывает переменную, разделяемую многими потоками (_count), поэтому мне нужно блокировать ее при чтении, чтобы избежать нечетких чтений. Не приведет ли это к блокировке вложенного монитора (взаимоблокировке), так как я блокирую уже потокобезопасный вызов метода?

Пример ниже:

lock (this)
{
    if (_count <= 10)
    {
        _someObj.DoSomethingThreadSafe(); //this method has its only locking internally
    }
}

Как бы это исправить?

1 Ответ

1 голос
/ 21 марта 2011

Нет, мониторы могут быть получены рекурсивно в .NET.( Возможно, это была ошибка проектирования , но это другое дело. Аналогично, я бы вообще не рекомендовал блокировку на this. Я бы предложил использовать личную ссылку, о которой знает только класс, выполняющий блокировку, напримерполе private readonly object, если * действительно не нужно выставлять блокировку на другой код.)

...