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

Вид: 20027|Ответ: 0

[Источник] Ключевое слово C# lock отмечает блок операторов как критическую область, получая mutex для данного объекта, выполняя оператор, но...

[Скопировать ссылку]
Опубликовано 31.12.2015 17:51:01 | | |
Ключевое слово блокировки отмечает блок операторов как критическую зону, принимая mutex для данного объекта, выполняя оператор и затем отпуская блокировку.

Оператор lock по сути использует Monitor.Enter и Monitor.Exit, то есть Monitor.Enter(this) выполняется при выполнении lock(this), а Monitor.Exit(this) — в конце завитого упряжки. Что это значит: для любого объекта первая часть памяти — это адрес всех методов, а вторая — индекс. Он указывает на SyncBlock в области SyncBlock Cache CLR. Что это значит? То есть, когда вы запускаете Monitor.Enter(Object), если индексное значение объекта отрицательное, выберите SyncBlock из кэша SyncBlock и поместите его адрес в индекс объекта. Это завершает блокировку, отмеченную объектом, и остальные потоки хотят снова выполнить операцию Monitor.Enter(object), которая получит индекс с положительным объектом и затем ждёт. Пока индекс не станет отрицательным, то есть поток не использует Monitor.Exit(object) для превращения индекса в отрицательный.

На что нужно обратить внимание при использовании замка:
1. блокировка не может заблокировать null значение Объект может указывать на null, но null не нужно освобождаться. (См. также: Понимание полного нуля)
2.lock не может заблокировать тип строки, хотя он также является эталонным типом. Потому что тип строки «зависает» CLR
Это означает, что во всей программе существует только один экземпляр любой заданной строки, и этот же объект представляет этот текст во всех потоках всех запущенных доменов приложений. Таким образом, пока блокировка на строке с одинаковым содержимым в любом месте процесса приложения будет заблокирована, все экземпляры этой строки в приложении будут заблокированы. Поэтому лучше заблокировать частных или защищённых участников, которые не будут сохранены.
3. Блокировать объект — это граница памяти программного блока
4. Тип значения не может быть заблокирован, потому что в предыдущем тексте «объект освобождён» красным цветом, а тип значения не является эталонным типом
5. Блокировка избегает блокировки публичных типов или объектов, не контролируемых программой.
Например, если экземпляр публично доступен, блокировка (это) может быть проблематичной, поскольку неконтролируемый код также может заблокировать объект. Это может привести к тупиковым блокировкам, когда два или более потоков ждут выпуска одного и того же объекта. Блокировка публичных типов данных (в отличие от объектов) также может вызвать проблемы по той же причине.
При использовании lock(this) значение переменной члена класса может изменяться методом, не находящимся в критической зоне

Сценарий применения: часто используется для предотвращения неопределённых исключений в ценности публичных переменных, вызванных многопоточными операциями, чтобы обеспечить безопасность операций









Предыдущий:Win8 запускает сервис SQL Server 2012
Следующий:[Скорость] IP-сегмент с открытым портом для быстрого сканирования!!
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com