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

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

[Источник] Почему блокировка может заблокировать только ссылку, но не тип значения

[Скопировать ссылку]
Опубликовано 08.12.2016 10:43:37 | | |

Если вы передаёте тип значения, он будет заблокирован, и в следующий раз, когда код будет выполняться здесь, он снова будет в коробке, и это не будет один и тот же объект дважды, поэтому его нельзя заблокировать



Замок(x)
{
  ...
}

Блокировка фактически осуществляется через объект Monitor:

Вышеуказанное эквивалентно:

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
Попробуй
{
  ...   
}
наконец
{
  System.Threading.Monitor.Exit(obj);
}

Затем процитирую оригинальные слова MSDN:
Используйте Monitor для блокировки объектов (то есть типов ссылок), а не для типов значений. Когда вы передаёте переменную типа значения в Enter, она появляется как объект. Если вы снова передаёте ту же переменную в Enter, она попадает в отдельный объект, и поток не блокируется. В данном случае код, который Monitor якобы защищает, не защищён. Кроме того, при передаче переменной в Exit создаётся ещё один отдельный объект. Поскольку объект, переданный в Exit, отличается от объекта, переданного в Enter, Monitor выдает SynchronizationLockException. Для получения дополнительной информации смотрите концептуальную тему Мониторы.




Предыдущий:Обновление Python 2.6.6 до 2.7.5 на системе Centos 6.4
Следующий:Разница между Directory.GetCurrentDirectory и Application.StartupPath
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com