В этом сценарии члены
ArrayList, видимый темой B
гарантированно будет как минимум до
дата, как они были, когда MyClass's
конструктор завершен?
Да, они есть.
Поток необходим для чтения памяти при первом обращении к ссылке. Поскольку хэш-карта построена, все записи в ней являются совершенно новыми, то ссылки на объекты up-to-date
по сравнению с тем, чем они были, когда конструктор завершил работу.
После этого начального столкновения применяются обычные правила видимости. Поэтому, когда другой поток изменяет неконечное поле в окончательных ссылках, другой поток может не увидеть это изменение, но он все равно увидит ссылку, полученную из конструктора.
В действительности это означает, что если вы не изменяете окончательную хэш-карту после конструктора, ее содержимое является константой для всех потоков.
EDIT
Я знал, что видел эту гарантию где-то раньше.
Вот интересующий вас абзац из этой статьи , которая описывает JSR 133
Инициализация безопасности
Новый JMM также стремится обеспечить
новая гарантия безопасности инициализации
- если объект правильно построен (это означает, что
ссылка на объект не
опубликовано до того, как конструктор
завершено), тогда все темы увидим
значения для его окончательных полей, которые
были установлены в его конструкторе,
независимо от того,
синхронизация используется для передачи
ссылка из одного потока в другой.
Далее любые переменные, которые могут быть
достиг через последнее поле
правильно построенный объект, такой как
поля объекта, на который ссылается
последнее поле, также гарантированно будет
видны и другим потокам. это
означает, что если последнее поле содержит
ссылка на, скажем, LinkedList, в
дополнение к правильному значению
ссылка видна другим
темы, а также содержание этого
LinkedList во время строительства будет
быть видимым для других тем без
синхронизации. Результатом является
значительное усиление
смысл финала - это финальные поля
можно безопасно получить доступ без
синхронизация, и это компиляторы
Можно предположить, что окончательные поля не будут
изменить и, следовательно, может оптимизировать
несколько выборок.