servlet的自動加載:
默認情況下,第一次訪問servlet的時候創建servlet對象,如果servlet的構造方法或initial方法中執行了比較多的邏輯代碼,那么導致用戶第一次訪問servlet的時候比較慢。
改變servlet創建對象的時候,提前到加載web應用的時候。
在servlet的配置信息中,加上一個<load-on-startup>即可。
1 <servlet> 2 <servlet-name>Demo1</servlet-name> 3 <servlet-class>com.maodoer.test.Demo1</servlet-class> 4 <!-- 讓servlet對象自動加載 --> 5 <load-on-startup>1</load-on-startup> 6 </servlet>
這樣就可以在tomcat服務器啟動的時候就會創建Servlet對象。
<load-on-startup>中,數值越大,優先級越低。
initial方法
1 /** 2 * 有參數的init方法和無參數的init方法 3 * @author MaoDoer 4 * 5 */ 6 public class InitDemo extends HttpServlet { 7 8 /** 9 * 有參數的init方法 10 * 該方法是Servlet的生命周期方法,一定會被tomcat服務器調用 11 */ 12 /** 13 * 注意:如果要編寫初始化代碼,不需要覆蓋有參數的init方法 14 */ 15 /* @Override 16 public void init(ServletConfig config) throws ServletException { 17 System.out.println("有參數的init方法"); 18 }*/ 19 20 /** 21 * 無參數的init方法 22 * 該方法是servlet的編寫初始化代碼的方法。是Sun公司設計出來專門 23 * 給開發者進行覆蓋,然后在里賣弄編寫servlet的初始邏輯代碼的方法 24 */ 25 @Override 26 public void init() throws ServletException { 27 System.out.println("無參數的init方法"); 28 } 29 }
Servlet對象在tomcat服務器中是單實例多線程的。
1 public class ThreadDemo extends HttpServlet{ 2 int count=1; 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 resp.setContentType("text/html;charset=utf-8"); 6 synchronized(ThreadDemo.class){ 7 resp.getWriter().write("你現在是該網站的第"+count+"個訪客");//線程1 8 //線程1還沒有執行count++,線程2就開始執行 9 /*try { 10 Thread.sleep(5000); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 }*/ 14 count++; 15 } 16 } 17 }
Servlet的多線程並發問題:
因為servlet是多線程的,所以當多個servlet的線程同時訪問了servlet的共享數據,如成員變量,可能會引發線程安全問題。
解決辦法:
1.把使用到共享數據的代碼塊進行同步(使用synchronized關鍵字進行同步)
2.建議在servlet類中盡量不要使用成員變量。如果確實要使用成員變量,必須同步。而且盡量縮小同步代碼塊的范圍。(哪里使用到了成員變量,就同步哪里),一筆秒因為同步而導致並發效率降低。