Reference article on JMMПочему блокировка с двойной проверкой все еще не приветствуется даже после летучего исправления?
Стоит отметить, что сломанные методы, такие как блокировка с двойной проверкой по-прежнему сломаны в соответствии с новой моделью памяти, и что «фиксация» перепроверил замок не было одной из целей новой модели памяти усилия. (Тем не менее, новая семантика летучего позволяет одним из наиболее часто предлагаемых альтернатив блокировки с двойной проверкой работать правильно, хотя технология до сих пор не рекомендуются.)
Связанных дискуссий:
- Why Double checked locking is 25% faster in Joshua Bloch Effective Java Example
- Why is double-checked locking broken in Java?
Я могу понять, почему она сломана без volatile
исправить. но я не знаю, почему это все еще обескураживается даже после исправления. Я заметил некоторые разногласия в одном из обсуждений. но если это действительно как рекомендация? что может быть причиной того, что эта фиксированная версия все еще не приветствуется?
Потому что есть лучшие варианты? Для одноэлементного шаблона, например, рекомендуется использовать перечисление. – assylias
Потому что очень легко получить это неправильно, очень сложно получить его и сохранить право, в основном без преимущества по сравнению с более легкими, менее тонкими методами, достигающими одной и той же цели. –
Я согласен с обоими предыдущими комментариями, но добавлю, что трудно * сказать *, когда вы ошибаетесь. т.е. он может «выглядеть правильно» для вас, но на самом деле ошибается. Лучше пойти с шаблоном, который, как известно, работает, чем попытаться пройти длинный путь, уже пройденный вами. – Bohemian