servlet的自動加載+init方法+線程並發安全


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類中盡量不要使用成員變量。如果確實要使用成員變量,必須同步。而且盡量縮小同步代碼塊的范圍。(哪里使用到了成員變量,就同步哪里),一筆秒因為同步而導致並發效率降低。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM