不太明白,为何servlet中的成员变量是对于每个连接是共享的,就算是servlet使用了多线程,每个线程也是新new出来的一个对象,成员变量也不应该只有一份

解决方案 »

  1.   

    Servlet只会存在一份,也就是所有的请求使用同一个Servlet对象!而并非每次New一个新对象所以成员变量是只有一份
      

  2.   

    产生的新线程只是去访问单实例的service方法
      

  3.   

    经验固然重要,读书才是王道
    楼上的不要误导到人,servlet并非只能有一个实例,有一个标示接口SingleThreadModel,在声明servlet时实现这个接口的就代表你的servlet类是单线成的,跟servlet相关的书上都有提到单线成模式下servlet实现数据库连接池的问题!
      

  4.   

    to mhw1010() 那是你不看清楚书的问题!Servlet一直都是单实例的,无论实现SingleThreadModel与否。SingleThreadModel的意思是指该Servlet永远只能被一线程独占访问,也就是后续的请求必须等待前面的所有用户访问完后才能进入方法。读死书是没有用的,书上不一定都正确,必须实践才能出真知!
      

  5.   

    还有SingleThreadModel是不建议使用的,它效率非常低,因为请求都不能并发连接池根本不应该使用这样的方式,无论Apache中的Common DBCP还是J2EE服务器自带的连接池都不需要SingleThreadModel
      

  6.   

    SingleThreadModel一般不建议用的,可以在sevlert必要只实行一个请求的时候,用synchronized来实现阿
      

  7.   

    to ChDw(米) ( ) 
    ------------------------
    下面这段是servlet api对SingleThreadModel的注释,servlet容器既然可以产生单个实例,当然可以产生多个,可能对实现该接口的并不一定会有多个实例,但是servlet只存在一份实例是不对的,注意下面用的instances复数!If a servlet implements this interface, you are guaranteed that no two threads will execute concurrently in the servlet's service method. The servlet container can make this guarantee by synchronizing access to a single instance of the servlet, or by maintaining a pool of servlet instances and dispatching each new request to a free servlet. 
      

  8.   

    SingleThreadModel目前的Web容器都是采用单实例模式的,而且SingleThreadModel已经被deprected了,你又看过没有!对于一个普通的Web程序来说是绝不应该实现SingleThreadModel的,绝大多数的Servlet都是单实例的模式去运行!
      

  9.   

    楼上的兄弟,我只想说明一点,就是servlet是可以有多个实例的,对servlet的了解不如楼上的多我承认。对一个servlet实例采用同步多线程,那么成员变量共享,如果不想这样,几个servlet实例采用同步多线程不就可以实现私有的成员变量了吗,而且可以设static的成员用来共享!
      

  10.   

    小弟初涉j2ee, 很多地方不明白,请多指教,谢谢大家,
    找到一篇关于这方面的好文章,共享出来:
    http://www.oreilly.com/catalog/jservlet/chapter/ch03.html
      

  11.   

    因为servlet是多线程的,最好不要定义成员变量,这样会有同步问题,其实可以用ServletContext或者session等都行!