Какой объект должен ждать монитор? - PullRequest
2 голосов
/ 02 февраля 2010

При использовании Monitor.Wait (object obj), что следует использовать для obj? В этой статье я читаю о многопоточности в .NET, автор создает новый объект () для использования только в качестве блокировки монитора. Это то, что вы должны делать на практике, или это более типично для мониторинга фактической переменной, общей для двух или более потоков?

Ответы [ 2 ]

4 голосов
/ 02 февраля 2010

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

Блокировка на this (текущий экземпляр, если вы используете C #) менее предпочтительна, поскольку любой код, имеющий доступ к экземпляру, может заблокировать его, увеличивая вероятность тупика. Создав собственный объект блокировки, вы полностью контролируете себя.

Вот информативная статья о блокировке, которая объясняет причины некоторых из этого.

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

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

...