CDI @RequestScoped是否可以防止并发问题?

时间:2017-12-07 12:05:56

标签: java multithreading java-ee thread-safety cdi

让我们说我们有一个班级:

@RequestScoped
public class FooService {
     private NonThreadSafeGenerator generator = new NonThreadSafeGenerator();

     public String generateId() {
          return this.generator.generateId();
     }
}

我们在一些servlet-container下运行我们的应用程序。它是线程安全的吗?换句话说,是否保证RequestScoped的bean始终只在单个线程中可见?

2 个答案:

答案 0 :(得分:1)

是的,保证。首先,您可以在6.3 Normal scopes查看CDI规范。花点时间阅读它,需要一点时间,但结论是普通的作用域基本上是线程限制的。

然后,为了真正说服你,让我们直接看看Weld代码库。普通范围上下文的所有实现都基于几个抽象的前驱类。如果你进行一些挖掘,你可以提出其中两个 - AbstractBoundContextAbstractUnboundContext。两者都使用ThreadLocal来实现底层bean存储 - 这将保证基于线程的行为。

答案 1 :(得分:0)

您的FooService bean实例一次只能由一个线程使用。

但是,NonThreadSafeGenerator.generateId()仍然可能不是线程安全的。例如,它可以依赖静态实例变量来实现状态,或者在另一个对象或类上调用方法来实现这一点。