Потокобезопасность .NET

Почему блокировка является типом, который рассматривают очень плохо? Например, lock(typeof(DateTime)) Я понимаю, что статические методы любого класса в .NET считают ориентированными на многопотоковое исполнение, и что члены экземпляра не. Таким образом, не необходимо заблокировать DateTime при использовании его. Книга, которую я читаю, не объясняет, почему это плохо, это просто говорит, что это. Любое объяснение будет большим.

7
задан 2 April 2010 в 13:23
поделиться

3 ответа

CLR поддерживает по одному экземпляру каждого типа для каждого домена приложения (и, как указывает Джо в своем ответе, иногда они даже используются в более широком контексте) .

Поскольку вы не контролируете доступ к типам, вы можете непреднамеренно блокировать или блокировать себя совершенно не связанным кодом, который также блокирует ваш тип.

Вместо этого вам обычно следует блокировать частные экземпляры , которые принадлежат к тому же классу, что и операция (или связанные операции), которую вы хотите заблокировать, чтобы вы могли контролировать, на что влияет и блокирует блокировка. (Хотя бывают также случаи, когда имеет смысл заблокировать какой-нибудь хорошо известный объект синхронизации, который предназначен для использования с разными объектами.)

9
ответ дан 6 December 2019 в 21:11
поделиться

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

Это обсуждается здесь .

1
ответ дан 6 December 2019 в 21:11
поделиться

Из MSDN :

Ключевое слово блокировки помечает блок операторов как критический раздел путем получения блокировки взаимного исключения для данного объекта, выполняя инструкцию, а затем снимая блокировку. Этот оператор принимает следующую форму:

Итак, в основном вы должны заблокировать объект.Поэтому, если вы хотите иметь блокировку, у вас должен быть конкретный объект, который вы блокируете, например контейнер, такой как HashTable или общий объект , специально используемый для блокировки.

Блокируя результат typeof (DateTime) , вы говорите, что никакой другой объект не может заблокировать этот тип. Это слишком грубая блокировка - другими словами, ваш код должен иметь возможность заблокировать другой объект DateTime в другом месте кода, но с вашим методом, который будет невозможно.

2
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: