2010-09-17 2 views
3

Можно создать дубликат:
Why is lock(this) {…} bad?Почему мы должны избегать блокировки (это)?

В C#, чтобы сделать критическую область поточно мы можем использовать lock() заявление. Оператор блокировки принимает объект. Что не так, если мы передаем this в инструкцию блокировки?

+0

Возможный дубликат: http://stackoverflow.com/questions/251391/why-is-lockthis-bad – Greg

ответ

6

От http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx:

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

  • lock (this) является проблемой, если экземпляр может быть доступен публично.
  • lock (typeof (MyType)) является проблемой, если MyType является общедоступным.
  • lock(“myLock”) - проблема, потому что любой другой код в этом процессе с использованием той же строки, будет разделять тот же самый блокировки.

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

6

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

Смежные вопросы