В ответ на ваш вопрос: Нет, CLR \ JIT не выполняет оптимизацию "elision lock", т.е. CLR \ JIT не удаляет блокировки из кода, который виден только отдельным потокам.Это можно легко подтвердить с помощью простых однопоточных тестов кода, в которых следует применять блокировку, как и следовало ожидать в Java.
Вероятно, существует ряд причин, по которым этого не происходит, но главным образом этотот факт, что в .Net Framework это, скорее всего, необычная прикладная оптимизация, поэтому не стоит усилий по ее реализации.
Кроме того, в .Net неконтролируемые блокировки очень быстры из-за того, что они не блокируюти выполняется в пространстве пользователя (JVM, похоже, имеют аналогичные оптимизации для непреднамеренных блокировок, например IBM ).Цитировать из C # 3.0 В главе о потоках в Nutshell
Блокировка выполняется быстро: вы можете ожидать, что получите и освободите блокировку менее чем за 100 наносекунд на компьютере с частотой 3 ГГц, еслиблокировка не выполняется "
Несколько примеров сценариев, в которых может применяться блокировка, и почему это того не стоит:
Использование блокировок внутри метода в вашем собственном кодекоторый действует исключительно на локальные системы
Во-первых, в этом сценарии нет веской причины использовать блокировку, поэтому, в отличие от оптимизаций, таких как поднятие инвариантов цикла или вставка метода, это довольно необычный случай.и результат ненужного использования блокировок. Среда выполнения не должна заботиться об оптимизации необычного и крайне плохого использования.
Использование чужого типа, который объявлен как локальный, который использует блокировки внутренне
Хотя это звучит более полезно, общая философия проектирования .Net Framework - оставить ответственность заили блокировка для клиентов, поэтому типы редко используют внутреннюю блокировку.Действительно, платформа .Net является патологически несинхронизированной, когда речь идет о методах экземпляров для типов, которые специально не предназначены и не рекламируются как параллельные.С другой стороны, у Java есть общие типы, которые включают синхронизацию, например, StringBuffer и Vector.Поскольку .Net BCL в значительной степени несинхронизирован, устранение блокировки, вероятно, будет иметь незначительный эффект.
Сводка
В целом, в .Net меньше случаев, когда блокировка блокируется.elision включился бы, потому что там просто не так много мест, где были бы локальные блокировки потока.Замки с гораздо большей вероятностью будут использоваться в местах, которые видны нескольким потокам и, следовательно, не должны быть исключены.Кроме того, бесконтрольная блокировка очень быстрая.
Мне было трудно найти какие-либо реальные доказательства того, что блокировка на самом деле обеспечивает такое большое преимущество в производительности Java (, например ... ), и последние документы по крайней мере для Oracle JVM заявляет, что elision не всегда применяется для локальных блокировок потоков, намекая на то, что в любом случае это не всегда заданная оптимизация.
Я подозреваю, что исключение блокировок возможно благодарявведение анализа побега в JVM, но это не так важно для производительности, как способность советника анализировать, могут ли ссылочные типы выделяться в стеке.