Когда я использую инъекцию полей в классе, например:
@Inject
private MyClass myField;
могу ли я сделать какое-либо предположение о статусе "безопасной публикации" этого поля? Или, говоря иначе, и предполагая, что сам MyClass является потокобезопасным, существуют ли какие-либо риски параллелизма, о которых я должен знать при использовании этого поля?
Мой инстинкт обычно состоит в том, чтобы создать все поля окончательными, если это возможно, но это не работает с внедрением полей. Конечно, я могу использовать внедрение конструктора, но тогда мне обычно приходится создавать дополнительный «фальшивый» конструктор без аргументов только для проксирования. Не большая проблема, но использование инъекций поля просто удобнее. Другим вариантом может быть пометка поля как изменчивого (или даже использование блокировки...), но действительно ли это необходимо?
Спецификация JSR-299, похоже, не отвечает на этот вопрос. Я использую CDI в таких реализациях, как Weld.
- Объект, в который я вставляю будет использоваться несколькими потоками (например, @ApplicationScoped). Я хочу этот.
- Я понимаю, что если MyClass неизменяем, безопасная публикация не вызывает беспокойства. Но я не обязательно ввожу только неизменяемые объекты.
- Предполагается, что сам MyClass является потокобезопасным; это не моя забота. Беспокойство касается исключительно небезопасной публикации, например. возможность того, что потоки увидят наполовину сконструированные экземпляры MyClass из-за правил модели памяти Java.