这个问题我在学习的时候是明白的,但是作项目之后逐渐淡忘,今天有人问起.
实在想不出是为什么,有些汗颜啊,哪位老大能给出较为完整的理论解释呢,小弟先谢拉

解决方案 »

  1.   

    Servlet一般用不着同步,除非你的代码是这样:public class MyServlet extends HttpServlet {
    private Object myobj=... public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    ....
    } public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       //dosomething with myobj
       ...
    }}除这种情况要对myobj 同步外,其它时候全部不需要.另外,一般不要在servlet里写成员变量,除非有特殊要求。
      

  2.   

    还是有些不明白的地方,对于servlet,有些书上是这样解释的
    1)当container开始启动,或是客户端发出请求服务时,Container会负责加载和实例化一个Servlet
      (一个servlet只会有一个实例吗?单例模式的吗?)
    2)多线程处理
      一个实例参与多线程处理,会方便吗?(这也许是个弱智的问题)
    3)调用destroy来销毁Servlet,进行垃圾收集以上认识对吗?请大虾指正之
      

  3.   

    还是有些不明白的地方,对于servlet,有些书上是这样解释的
    1)当container开始启动,或是客户端发出请求服务时,Container会负责加载和实例化一个Servlet
      (一个servlet只会有一个实例吗?单例模式的吗?)
    servlet不是单例的.不过一般来说一个servlet只会有一个实例:
    当container开始启动,或是客户端发出请求服务时---如果servlet在web.xml中配置了load-on-startup那么就是在容器加载Servlet初始化,否则等到第一次请求时:
    <servlet>
    <servlet-name>DeleteNews</servlet-name>
    <servlet-class>com.uland.ent.servlet.DeleteNews</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    而一般的Servlet启动后只有一个实例因为一般时对同一Servlet只配置一个mapping:
    <servlet-mapping>
    <servlet-name>DeleteNews</servlet-name>
    <url-pattern>/DeleteNews</url-pattern>
    </servlet-mapping>
    但是如果配置了多个mapping,那么会有多个Servlet实例2)多线程处理
      一个实例参与多线程处理,会方便吗?(这也许是个弱智的问题)
    这个不知道你说的是啥3)调用destroy来销毁Servlet,进行垃圾收集
    destroy可以写释放资源的行为,或者这个Servlet的相应业务。释放资源一般是指这种如:
    public class MyServlet extends HttpServlet {
    FileOutPutStream fos=null;
    public void init(..){
    fos=new FileOutPutStream();
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    ....
    }public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       //dosomething with myobj
       ...
    }
    public void destroy(){
    fos.close();
    }}
    或者你的程序是计算素数的,而在下次启动时从配置文件中加载,可以把加载写在init里,最后写文件关闭写在destroy里
      

  4.   

    一个servlet对应多个mapping,原谅我的孤漏,我确实是第一次听说
    依照eureka0891(迷茫中...) 的意思,是一个mapping对应一个实例拉???一个实例参与多线程处理,会方便吗?(这也许是个弱智的问题)
    我的意思一个对象在多个线程中被调用,就是调用这个对象的同一个方法.那么它的处理速度会很慢吗?我的理解很混沌的
      

  5.   

    一个servlet对应多个mapping,原谅我的孤漏,我确实是第一次听说
    依照eureka0891(迷茫中...) 的意思,是一个mapping对应一个实例拉???
    确实如此,你可以试试.如下面的程序,程序里有个变量count来存储此servlet访问了多少次。
    public class MyServlet extends HttpServlet {
    private int count=0;public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    doPost(request,response);
    }public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
       //dosomething with myobj
    count++;
    System.out.print(count);
       ...
    }
    }
    然后你配置两个mapping,就可以看到结果了
    ============================================================================
    一个实例参与多线程处理,会方便吗?(这也许是个弱智的问题)
    我的意思一个对象在多个线程中被调用,就是调用这个对象的同一个方法.那么它的处理速度会很慢吗?我的理解很混沌的
    看你的这个对象的方法怎样了,一般如果一个对象用到多线程时都要考虑同步,那么肯定会比不同步的要慢得多,如果没有同步代码块应该是区别不大的}
    然后配置两个mapping,你就可以看到结果