Как заблокировать в .NET, используя экземпляр класса, объект или тип - PullRequest
2 голосов
/ 10 октября 2011

Я хотел бы знать, как вы знаете, когда блокировать весь тип

lock (typeof(MyClass))
{
...
}

или экземпляр

lock (this)
{
...
}

или объект

lock (this._lockObj)
{
...
}

Я спрашиваю об этом, потому что у меня есть статический класс, который является простым Wrapper for Enterprise Library 5 и доступен для нескольких компонентов из разных потоков.Метод WriteLog () заблокирован.Я использую тип для блокировки.

Ответы [ 4 ]

4 голосов
/ 10 октября 2011

В MSDN есть следующее: (http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx)

В общем, избегайте блокировки на открытый тип или экземпляры, не зависящие от вашего кода. Общие конструкции lock (this), lock (typeof (MyType)) и lock ("myLock") нарушают это правило:

lock (this) is a problem if the instance can be accessed publicly.

lock (typeof (MyType)) is a problem if MyType is publicly accessible.

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.

Рекомендуется определять частный объект для блокировки или частную переменную статического объекта для защиты данных, общих для всех экземпляров.

У меня было несколько случаев, когда для блокировки требовалось что-либо, кроме закрытого объекта.

3 голосов
/ 10 октября 2011

Первое правило. Блокировка с использованием объекта, который недоступен извне класса. Вот почему this и различные typeof являются плохой идеей. Внешний код может помешать вашим замкам. Тогда вопрос в том, что это за lock. Если оно статическое, тогда используйте статическое поле, в противном случае используйте поле экземпляра.

Чтобы выбрать правильный lock объект, вы должны идентифицировать группы кода, которые являются взаимоисключающими. Так что если у вас есть 4 метода, которые являются эксклюзивными в парах, таких как A и B, C и D, у вас должно быть 2 разных lock объекта, а не 1.

1 голос
/ 10 октября 2011

В случае, если вы хотите заблокировать весь тип, вы должны реализовать шаблон Singleton.
Ответственность за блокировку должна лежать внутри фактической реализации класса - в противном случае рано или поздно вы столкнетесь с проблемами блокировки - особенно тупики могут тольков противном случае следует избегать, когда у вас есть порядок блокировки.
Не скрывать блокировку - это рецепт для бедствия.

0 голосов
/ 10 октября 2011

В статье MSDN предлагается блокировать тип при использовании статического класса / метода, чтобы вы могли нормально его использовать.

Также предлагается использовать «this» для защиты переменных экземпляра.

EDIT

Как и предполагалось, вот статья MSDN:

http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.71).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...