14
  1. Может ли кто-нибудь объяснить Инициализация безопасности как требуется модель памяти Java?
  2. Как сделать окончательные полей помогают в достижении Инициализация безопасности?
  3. Какую роль выполняет конструктор играть в обеспечение Инициализация безопасности?

ответ

21

Безопасность инициализации обеспечивает возможность просмотра объекта внешним потоком в полностью сконструированном (инициализированном) состоянии. Предпосылкой является то, что объект не должен публиковаться преждевременно, т.е. в его конструкторе. Как только это будет обеспечено, JMM требует определенного поведения для полей, объявленных как final. Во-первых, все final поля объектные guarenteed быть увиденным наружной резьбой в его полностью инициализирован состоянии - это не так тривиально, как это звучит -

Рассмотрим класс

class A{ 
    List list ; 
    A() { 
     list = Arrays.asList(some init expressions that adds 10 elements to list); 
    } 

} 

поток, который обращается к list экземпляра A не по умолчанию гарантированно увидит 10 элементов в этом списке. Фактически, этот поток может даже видеть list как null. Однако, если list объявлен final, то, как требуется JMM, list должен всегда отображаться с использованием 10 элементов.

Во-вторых, эта гарантия инициализации не ограничивается самим полем final, но рекурсивно распространяется на все объекты, переданные им. Например, если в приведенном выше примере list представляет собой список самих list, тогда внешний поток гарантированно будет видеть внутренние списки как полностью инициализированные.

Обратите внимание, что нигде мы не используем synchronized для достижения этой безопасности в видимости памяти (происходит до отношения).

+1

+1, отметив, что безопасность инициализации не только гарантирует безопасность для конечных полей, но также и для объектов, на которые ссылаются конечные поля. – Inquisitive

4

1. Инициализация безопасность позволяет правильно построены неизменных объектов для совместных безопасно потоков без использования синхронизации, независимо от того, даже если они опубликованы с помощью гонки данных.

2. Объектов, имеющие конечную область, безопасность инициализации предотвращают переназначения любой части конструкции с начальной нагрузкой ссылки на этот объект.

+0

«независимо от того, даже если они опубликованы с использованием гонки данных». Эта линия не имеет никакого смысла. Объекты не публикуются с использованием расчётов данных :-). – Inquisitive

+2

Я не уверен насчет «предотвращения переупорядочения любой части конструкции». Гарантии для окончательных полей вступают в силу только для инициализации этих окончательных полей, а не для других частей конструкции. – axtavt

+0

@axtavt Фактическое переупорядочение предотвращается, если поле нестабильно не является окончательным. Итак, точка 2 неверна по мне. – Inquisitive

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