我需要知道这是如何工作的:
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
这意味着,在某些情况下,当服务器接收到请求(实际上是FacesAPI)时,它会执行以下操作:
FacesContext fx = new FacesContext();
fx.setRequest(httpServletRequest);
FacesContext.setCurrentInstance(fx);
所以。。假设这种情况:
发送了一个请求。。。已填充FacesContext对象。。然后它在此期间等待5秒(通过任何方式,例如使用Thread.sleep()
)。。另一个发送的请求,据我所知,他将覆盖FacesContext.getCurrentInstance()
对象的内容。。因此,当上一个请求来自睡眠时,它将读取被覆盖的内容。。
我的理解是真的吗???
不,这不是真的。每个HTTP请求/响应周期都在一个完全专用的线程中执行。FacesContext
在请求开始时创建,并作为ThreadLocal
变量存储,当响应完成时,该变量将被丢弃。getCurrentInstance()
返回ThreadLocal
变量。在同一线程中执行的代码中的任何位置(读取:同一请求)都可以访问同一FacesContext
实例。不同的请求在它们自己的线程中运行,具有它们自己的FacesContext
实例。CCD_ 9的创建和销毁由CCD_。
另请参阅:
- java线程本地单例-它是什么?-相关答案
- servlet是如何工作的?实例化、会话、共享变量和多线程-解释servlet生命周期
- 如何在servlet环境中初始化API——实现
ThreadLocal
的代码示例