Связь между правилами «происходит до» и правилом безопасности при инициализации

Я читаю книгу Java Concurrency in Practice.

При чтении главы о JMM говорится:

JMM определяет частичное упорядочение, называемое «происходит до» для всех действий в программе. Чтобы гарантировать, что поток, выполняющий действие B, может видеть результаты действия A (независимо от того, происходят ли A и B в разных потоках), должна существовать связь между A и B.

Однако я не могу использовать какое-либо правило «происходит до» для получения правила «Безопасность инициализации»:

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

Можем ли мы использовать правила «происходит до» для получения правила «Безопасность инициализации», или эти две концепции просто абстракция одного уровня?


person YON    schedule 05.10.2019    source источник
comment
Можем ли мы использовать правила «происходит до» для получения правила безопасности инициализации? Это правило само по себе вводит отношение происходит до между описанными действиями. Это как аксиома: ее не нужно выводить.   -  person Tsyvarev    schedule 12.10.2019


Ответы (1)


«Правило безопасности инициализации» — это специальное правило, которое нельзя вывести из других отношений происходит до и нельзя комбинировать с другими отношениями произошло до для получения дополнительных сведений. правила.

Правило указано в JLS §17.5. , окончательная семантика поля:

Поля final также позволяют программистам реализовывать потокобезопасные неизменяемые объекты без синхронизации. Поточно-безопасный неизменяемый объект рассматривается всеми потоками как неизменяемый, даже если для передачи ссылок на неизменяемый объект между потоками используется гонка данных. Это может обеспечить гарантии безопасности от неправильного использования неизменяемого класса неправильным или вредоносным кодом. final поля должны использоваться правильно, чтобы гарантировать неизменность.

Глава слишком длинная, чтобы цитировать ее полностью, но я хочу подчеркнуть это конкретное утверждение:

Этот порядок происходит до не закрывается транзитивно с другими заказами происходит до.

Таким образом, «правило безопасности инициализации» существует в дополнение к другим отношениям происходит до, чтобы помочь в создании неизменяемых объектов.

person Holger    schedule 24.01.2020