Почему блокировка является типом, который рассматривают очень плохо? Например, lock(typeof(DateTime))
Я понимаю, что статические методы любого класса в .NET считают ориентированными на многопотоковое исполнение, и что члены экземпляра не. Таким образом, не необходимо заблокировать DateTime при использовании его. Книга, которую я читаю, не объясняет, почему это плохо, это просто говорит, что это. Любое объяснение будет большим.
CLR поддерживает по одному экземпляру каждого типа для каждого домена приложения (и, как указывает Джо в своем ответе, иногда они даже используются в более широком контексте) .
Поскольку вы не контролируете доступ к типам, вы можете непреднамеренно блокировать или блокировать себя совершенно не связанным кодом, который также блокирует ваш тип.
Вместо этого вам обычно следует блокировать частные экземпляры , которые принадлежат к тому же классу, что и операция (или связанные операции), которую вы хотите заблокировать, чтобы вы могли контролировать, на что влияет и блокирует блокировка. (Хотя бывают также случаи, когда имеет смысл заблокировать какой-нибудь хорошо известный объект синхронизации, который предназначен для использования с разными объектами.)
Помимо уже упомянутых причин, объект Type может совместно использоваться разными доменами приложений в рамках одного процесса. Поэтому код, работающий в другом домене приложений, может заблокировать ваше приложение.
Это обсуждается здесь .
Из MSDN :
Ключевое слово блокировки помечает блок операторов как критический раздел путем получения блокировки взаимного исключения для данного объекта, выполняя инструкцию, а затем снимая блокировку. Этот оператор принимает следующую форму:
Итак, в основном вы должны заблокировать объект.Поэтому, если вы хотите иметь блокировку, у вас должен быть конкретный объект, который вы блокируете, например контейнер, такой как HashTable
или общий объект
, специально используемый для блокировки.
Блокируя результат typeof (DateTime)
, вы говорите, что никакой другой объект не может заблокировать этот тип. Это слишком грубая блокировка - другими словами, ваш код должен иметь возможность заблокировать другой объект DateTime
в другом месте кода, но с вашим методом, который будет невозможно.