大家都知道servlet是单实例,那么filter中如果定义成员变量,会不会出现像servlet一样的结果呢.

解决方案 »

  1.   

    public class QueryFilter implements Filter { private FilterConfig filterConfig; private FilterChain chain; private HttpServletRequest req; private HttpServletResponse res; public void destroy() {
    this.filterConfig = null;
    } public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
    this.chain = chain;
    this.req = (HttpServletRequest) request;
    this.res = ((HttpServletResponse) response);如果这样写,一定会出问题咯?
      

  2.   

    servlet是单实例??谁说的? 如果1000个人请求servlet,难道还排队啊!!??
      

  3.   

    servlet是单实例绝对没错,可以去多看下资料就会了解.
      

  4.   

    to java2000_net:
    servlet肯定是单事例.在服务器启动的时候或者调用的时候创建一次.
    还有1000个人请求一个对象不行吗?调用跟同步是不一样的.c语言的双重检查机制没看过把.
    除非你把对象同步了.那么要排队.就这样还专家?
      

  5.   

    to lz:
    由于服务器内部对所有过滤器生成过滤链,并在服务启动的时候构建,所以只有一个事例.上面的写法一定会有多线程的并发问题.但是用线程安全的集合容器就可以避免成员变量被并发覆盖.但是调用的时候的并发依然存在.因为java无法在多线程的情况下无法确定哪个线程先调用方法.关于调用的并发可以参考<<java模式>>双重检查机制一章.但是这样的并发实在是太少,所以除了struts的action是单例之外,其他的前台框架,如spring都将并发忽略了
      

  6.   

    忘了加一句,struts的action不单单例,而且得到的方法是同步的.
      

  7.   

    楼上解释的非常清楚,我昨天已经做过实验.servlet或filter的成员变量确实是不可取