注入(@Inject)字段是否安全发布?

Han*_*ari 9 java thread-safety cdi weld

当我在类中使用字段注入时,如下所示:

@Inject
private MyClass myField;
Run Code Online (Sandbox Code Playgroud)

我可以对这个领域的" 安全出版 "状态做出任何假设吗?或者换一种说法,假设MyClass本身是线程安全的,那么使用这个字段时我应该注意哪些并发风险?

我的直觉通常是尽可能创建所有字段final,但这不适用于字段注入.当然,我可以使用构造函数注入,但是我通常最终只需要为代理创建一个额外的"假"no-args构造函数.没有太大问题,但使用现场注入更方便.另一种选择可能是将该字段标记为易变(或甚至使用锁定......),但这是否真的有必要?

JSR-299规范似乎没有回答这个问题.我在像Weld这样的实现上使用CDI.

  • 我注入到该对象被多个线程(它@ApplicationScoped,例如)中使用.我要这个.
  • 我知道如果MyClass是不可变的,安全发布不是一个问题.但我不一定只注入不可变对象.
  • 假设MyClass本身是线程安全的; 这不是我关心的问题.由于Java内存模型的规则,严格关注的是不安全的发布,例如线程看到MyClass的半构造实例的可能性.

Ste*_*ker 1

我总是使用构造函数注入。那么你的字段可能是最终的,并且它们的线程安全性是没有问题的。