2011-04-27 2 views
2

Я смотрел на доступных значениях MethodImplOptions перечисления, когда я заметил следующее:Почему метод MethodImplOptions.Synchronized вызывает блокировку, если это не рекомендуется?

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

Так что мне интересно, почему компилятор (или это делается с помощью .Net runtime?) Делает это вместо создания частного поля и блокировки на этом?

Это звучит как простой исправить, но я полагаю, что это не ...

+0

Это совершенно безопасно (обычное многопоточное безумие) для использования на непубличных типах. Как и в документах. –

+0

Да, вы правы, но использование частного поля сделало бы его безопасным и с публичными типами. И я не думаю, что это вызовет какие-либо проблемы. –

+1

Это позволяет вам разобраться и смешать и сопоставить флаг «Синхронизированный» с операторами 'lock'. Хм, может быть, это не аргумент в пользу этого ... –

ответ

2

Это делается с помощью CLR - если бы это было сделано компилятором, он не будет требовать атрибут.

Возможно, что там, чтобы сделать его проще для запуска Java-кода ... либо это, или это просто ошибка распространяется от Java мышления :(

(Тот факт, что каждый объект может иметь монитор, связанный с ошибкой для начала, IMO ... опять же, скопирован из Java в основном.)

+0

Это звучит слишком очевидно, чтобы быть ошибкой. Ведь проблема хорошо известна и даже отмечена в документации. Но как сделать код Java проще? Общепринято ли это блокировать это? –

+1

@Rune: на Java вы можете объявлять синхронизированные методы. Я не знаю, что они реализованы флагом метода или компилятором, но если это как флаг метода, это эквивалентно интерфейсу. Просто потому, что проблема хорошо известна и документирована * сейчас *, это не значит, что это была не ошибка * тогда *. –

+0

Хорошая точка. Я не думаю, что блокировка на частном поле по сравнению с блокировкой на этом вызовет любые проблемы. Так есть ли причина не делать этого? –

Смежные вопросы