【轉】怎樣理解Servlet的單實例多線程

 

轉自 http://blog.chinaunix.net/uid-7374279-id-3687149.htmlhtml

首先明確:Servlet是單實例的,即對於同一種業務請求只有一個是實例。不一樣的業務請求能夠經過分發來產生多個實例。
其次:單實例的緣由我想是由於單實例足能夠處理某一個請求,就像ibatis的Querydao、UpdateDao同樣都是單實例的。
再次:爲何單實例足能夠處理某一個請求,由於Servlet是單實例多線程的。
http://hiyachen.cublog.cn  chf@tsinghua.org.cn
先看一段代碼:
java

package hiya.test;


public class Servlet {
 

private static Servlet instance=new Servlet();

private Servlet(){

 
 

}

public static Servlet getInstance(){

  return instance;

}

public void services(){

  System.out.println("do something");

}


static class Client extends Thread{

  private Servlet servlet;

  public Client(Servlet servlet){

   this.servlet=servlet;

  }

  public void run(){

   servlet.services();

   //System.out.println("do something");

  }

}


public static void main(){

  Servlet servlet=Servlet.getInstance();

  for(int i=0;i<10;i++){

   Client client=new Client(servlet);

   client.start();

  }

}

}

servlet單實例多線程處理原理:
servlet中的init方法只有在啓動(例如web容器啓動,要看loadOnStartup的設置)的時候調用,也就是隻初始化一次,這就是單實例。
servlet在處理請求的時候 調用的是service方法,這個方法能夠處理多個客戶端的請求。
具體訪問時:
JSP 在web容器中"翻譯成servlet"由容器執行,web 容器自己就是提供的多線程,A,B,C 3個訪問,創建3個獨立的線程組,而後運行一個servlet。依次執行。
這就解決了多用戶同一實例實行的困惑。
要注意幾點:
1:servlet首先不是現成線程的。2:Servlet體系結構是創建在Java多線程機制之上的,它的生命週期是由Web容器負責的。   Servlet容器會自動使用線程池等技術來支持系統的運行
3:設定jsp:<%@ page isThreadSafe="false"%>來實現單線程。   當你須要保證數據一致性的時候,必須本身處理線程安全問題時能夠考慮單線程。
這是單實例多線程的實現代碼。(真想把jdk源碼貼出來。)
歡迎探討。web

相關文章
相關標籤/搜索