当我在类中使用字段注入时,如下所示:
@Inject
private MyClass myField;
我可以对“安全发布”做任何假设吗”状态或者换一种说法,假设 MyClass 本身是线程安全的,在使用这个字段时我应该注意什么并发风险?
我的直觉通常是尽可能创建所有字段 final ,但这不适用于字段注入。当然,我可以使用构造函数注入,但是我通常最终不得不创建一个额外的“假”无参数构造函数来进行代理。问题不大,但使用字段注入更方便。另一种选择可能是将字段标记为易失性(甚至使用锁定...),但这真的有必要吗?
JSR-299 规范似乎没有回答这个问题。我在 Weld 等实现上使用 CDI。
- 我注入的对象将被多个线程使用(例如,@ApplicationScoped)。我要这个。
- 我知道如果 MyClass 是不可变的,安全发布就不是问题。但我不一定只注入不可变对象。
- MyClass 本身被假定为线程安全的;这不是我关心的问题。由于 Java 内存模型的规则,严格来说,关注的是不安全的发布,例如线程看到 MyClass 的半构造实例的可能性。