2016-08-17 8 views
3

Reference article on JMMПочему блокировка с двойной проверкой все еще не приветствуется даже после летучего исправления?

Стоит отметить, что сломанные методы, такие как блокировка с двойной проверкой по-прежнему сломаны в соответствии с новой моделью памяти, и что «фиксация» перепроверил замок не было одной из целей новой модели памяти усилия. (Тем не менее, новая семантика летучего позволяет одним из наиболее часто предлагаемых альтернатив блокировки с двойной проверкой работать правильно, хотя технология до сих пор не рекомендуются.)

Связанных дискуссий:

Я могу понять, почему она сломана без volatile исправить. но я не знаю, почему это все еще обескураживается даже после исправления. Я заметил некоторые разногласия в одном из обсуждений. но если это действительно как рекомендация? что может быть причиной того, что эта фиксированная версия все еще не приветствуется?

+2

Потому что есть лучшие варианты? Для одноэлементного шаблона, например, рекомендуется использовать перечисление. – assylias

+2

Потому что очень легко получить это неправильно, очень сложно получить его и сохранить право, в основном без преимущества по сравнению с более легкими, менее тонкими методами, достигающими одной и той же цели. –

+0

Я согласен с обоими предыдущими комментариями, но добавлю, что трудно * сказать *, когда вы ошибаетесь. т.е. он может «выглядеть правильно» для вас, но на самом деле ошибается. Лучше пойти с шаблоном, который, как известно, работает, чем попытаться пройти длинный путь, уже пройденный вами. – Bohemian

ответ

0

Итак, в первую очередь: с новой Java MM двойная отметка блокировки idiom равна не сломанной больше. Таким образом, вы можете безопасно использовать его в Java.

Существуют также ситуации, когда нельзя использовать другие альтернативы (например, перечисления или статическую инициализацию). Например, если вам нужен доступ к нестатической ссылке, чтобы построить синглтон.

Так что это безопасно использовать, если вы полностью поняли идиому.