我知道 Application-Scope 在多个用户中持续存在,所以很明显,我们应该确保所有 ApplicationScoped ManagedBeans 都是线程安全的。
我也明白,我们不需要关心RequestScoped ManagedBean的线程安全性。这是因为它只持续一个 HTTP 请求,并且如果引用了每个请求,则会新实例化。
但是我不太确定为什么我们应该担心SessionScoped ManangedBean的线程安全性。即使它在多个请求中仍然存在,每个用户也会获得他/她自己的实例,对吗?
那么,为什么我们需要担心在 SessionScoped ManagedBeand 的情况下的线程安全性,这也适用于 ViewScoped ManagedBean 吗?ViewScope 在对同一视图的 2 个连续请求中持续存在,对吗?
如果您已经担心某个范围内的数据的线程安全性,那么数据很可能属于更窄的范围(即高级设计中存在缺陷)。如果数据被放在正确的范围内,那么完全没有理由担心线程安全。我假设你的豆子设计得正确,它们没有在getter中做任何业务逻辑。
将应用程序范围用于应用程序范围的数据/常量,例如对每个人都相同的下拉列表。将会话范围用于客户端特定数据,例如登录用户和用户首选项(语言等)。将视图范围用于启用 ajax 的丰富动态视图(基于 ajax 的验证、呈现等)。将请求范围用于简单和非 ajax 窗体/演示文稿。