轉自 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