Различие связано с тем, что lock
, в случае неправильного использования, может привести к взаимоблокировке потока.Если видимость цели блокировки вам неизвестна (т. Е. Вы не можете быть на 100% уверены, кто имеет ссылку на цель, и если / когда они могут lock
ее), то вы не можете точно знать, может ли приложение зайти в тупик.
По этой причине обычно блокируется элемент private
: поскольку он является личным и находится в вашем коде, вы делаете знаете, что никто другой не может lock
его.
Конечно, в большинстве случаев это чисто академическая разница (обычно люди не обходят блокировку случайных объектов), но это хорошая практика защитного кодирования.
Страница, на которую вы ссылаетесь:
В общем, избегайте блокировки на общедоступный тип или экземпляры, не зависящие от вашего кода.Общие конструкции lock (this), lock (typeof (MyType)) и lock ("myLock") нарушают это правило:
lock (this) является проблемой, если к экземпляру можно получить открытый доступ.
Поскольку кто-то другой может заблокировать экземпляр, используя имеющуюся у него ссылку, и ваш код, который делает lock(this)
, конечно, не будет ожидать этого. Пример для IDEone (см. Строку 26).
Блокировка (typeof (MyType)) является проблемой, если MyType общедоступен.
Разновидность вышеприведенного: если тип виден другому коду, вы можете попытаться заблокировать тот же экземпляр, что и этот код (typeof
возвращает одиночные экземпляры).
Блокировка ("myLock") является проблемой, потому что любой другой код в процессе, использующий ту же строку, будет иметь ту же самую блокировку.
Еще один вариант: из-за интернирования строк код в конечном итоге пытаетсязаблокируйте тот же экземпляр.
Рекомендуется определить закрытый объект для блокировки или переменную закрытого статического объекта для защиты данных, общих для всех экземпляров.