让我们说我们有一个班级:
@RequestScoped
public class FooService {
private NonThreadSafeGenerator generator = new NonThreadSafeGenerator();
public String generateId() {
return this.generator.generateId();
}
}
我们在一些servlet-container下运行我们的应用程序。它是线程安全的吗?换句话说,是否保证RequestScoped的bean始终只在单个线程中可见?
答案 0 :(得分:1)
是的,保证。首先,您可以在6.3 Normal scopes查看CDI规范。花点时间阅读它,需要一点时间,但结论是普通的作用域基本上是线程限制的。
然后,为了真正说服你,让我们直接看看Weld代码库。普通范围上下文的所有实现都基于几个抽象的前驱类。如果你进行一些挖掘,你可以提出其中两个 - AbstractBoundContext
和AbstractUnboundContext
。两者都使用ThreadLocal
来实现底层bean存储 - 这将保证基于线程的行为。
答案 1 :(得分:0)
您的FooService
bean实例一次只能由一个线程使用。
但是,NonThreadSafeGenerator.generateId()
仍然可能不是线程安全的。例如,它可以依赖静态实例变量来实现状态,或者在另一个对象或类上调用方法来实现这一点。