.net поток безопасности - PullRequest
7 голосов
/ 02 апреля 2010

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

Ответы [ 3 ]

9 голосов
/ 02 апреля 2010

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

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

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

2 голосов
/ 02 апреля 2010

С MSDN :

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

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

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

1 голос
/ 02 апреля 2010

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

Здесь обсуждается это .

...