Ull*_*las 7 thread-safety facescontext jsf-2
在经历javadoc时FacesContext,我偶然发现了这句话
在调用release()方法之前,实例保持活动状态,之后不允许进一步引用此实例.当FacesContext实例处于活动状态时,除了执行此Web应用程序的servlet容器用于处理此请求的线程之外,不得从任何线程引用它.
这是否意味着FacesContext永远不会进行垃圾收集,只有当current-webapplication停止(服务器停止)时才会销毁实例?
是FacesContext以下单例模式?在这种情况下,当多个请求同时呈现响应时它将如何表现,因为它每次只提供一个请求?
Bal*_*usC 11
这是否意味着
FacesContext永远不会进行垃圾收集,只有当current-webapplication停止(服务器停止)时才会销毁实例?
不,你读错了.在FacesContext生活中,只要一个HTTP请求.它(实际上,"可以"是一个更好的词)如果你错误地在你自己的代码中的任何地方引用它超出其范围,它将不会立即被GC引导.例如,作为会话范围的托管bean的属性,其活动时间长于单个HTTP请求:
@ManagedBean
@SessionScoped
public class BadSessionBean {
// Bad Example! Never do this! Not threadsafe and instance can't be GC'ed by end of request!
private FacesContext context = FacesContext.getCurrentInstance();
}
Run Code Online (Sandbox Code Playgroud)
如果你没有在你的代码中的任何地方这样做,因此你总是在方法局部范围内获得当前实例,那么它将有机会正确地进行GC.
@ManagedBean
@SessionScoped
public class GoodSessionBean {
public void someMethod() {
// OK! Declared in method local scope and thus threadsafe.
FacesContext context = FacesContext.getCurrentInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,此GC行为并非特定于JSF/FacesContext,它仅适用于基本Java.
是
FacesContext以下单例模式?在这种情况下,当多个请求同时呈现响应时它将如何表现,因为它每次只提供一个请求?
不,这绝对不是单身人士.它是一个ThreadLocal实例,它是在方法输入FacesServlet之后立即创建的,service()并FacesServlet在service()方法离开之前由右侧销毁.因此,每个请求只有一个实例(因此不是每个应用程序).请注意,一个HTTP请求计为一个单独的线程.可以有多个线程(读取:请求),因此FacesContext在应用程序的生命周期中可以有多个实例.它的主要模式是立面图案,但这与它的进一步无关ThreadLocal.