Блокировка выделяет
-
10-07-2019 - |
Вопрос
Я где-то читал, хотя и не помню где, что использование ключевого слова lock в C# может выделять ресурсы.
Я знаю, что попытка заблокировать ValueType приведет к блокировке типа значения, но есть ли другие ситуации?
РЕДАКТИРОВАТЬ::
- Кажется, все отвечают на случай Valuetype, я уже знаю это!
- Я также знаю, что такое блокировки и как использовать их в большой глубине, общие советы по передовой практике хороши - но бесполезны;)
- Мне нужно знать, потому что я строю приложение XNA для развертывания на Xbox.Коллекционер мусора Xbox действительно медленный - это означает, что мне нужно сохранить ассигнования до минимума, предпочтительно отсутствующего (что предотвращает когда -либо работать коллекционером)
Решение
Хотя внутреннее выделение блока синхронизации является ленивым (но это деталь реализации, которую IIRC я знаю из «тома 1» Essential.NET, или это CLR через C # - и его следует рассматривать именно так), простой случай предмет, который нужно упаковать в коробку, как вы предлагаете, не возникает - см. Почему lock(<integer var>) не разрешен, а Monitor.Enter(<integer var>) разрешен?
Другие советы
Если вы думали об использовании:
заблокировать (это)
Вы должны знать это, поскольку вы смотрите на свой экземпляр, пользователи вашего класса также могут заблокировать его и испортить вас.Независимо от того, является ли это проблемой, зависит от того, что, по вашему мнению, могут сделать ваши пользователи.Такая же ситуация существует, если вы делаете:
блокировка (тип (MyClass))
Если ты не хочешь этого делать, Вы можете легко выделить статический объект или объект экземпляра (т.е. объект mylock = new Object ()), а затем заблокировать это.
Что касается блокировки ссылочный тип и тип значения, этот ТАК вопрос о блокировке ресурса при его получении... есть ответ:
Это зависит от типа - если тип ссылки, то да, если тип значения №.Вот почему вы никогда не должны блокировать тип значения, так как тип значения будет в коробке, и любые последующие попытки заблокировать это значение фактически приобретают блокировку на другом объекте.
Определение оператора блокировки:
Заявление о блокировке (Справочник по C#)
Ключевое слово блокировки отмечает блок оператора в качестве критического раздела путем получения блокировки взаимной эксклюзии для данного объекта, выполнения оператора, а затем освобождая блокировку.
Этот ТАК вопрос по ключевому слову блокировки в С# может быть смогу помочь.Вы также можете посмотреть Почему lock() не разрешен, а Monitor.Enter() разрешен?
Спецификация компилятора определяет поведение блокировки такое:
Тип времени компиляции выражения оператора блокировки должен быть параметрам опорного типа или> типа A> типа (§25.1.1), известным как ссылочный тип.Это ошибка времени компиляции для типа времени компиляции выражения для обозначения типа значения.