最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb中Servlet的生命周期及線程安全問題詳解

 更新時間:2024年01月13日 10:30:14   作者:尼古丁?真  
這篇文章主要介紹了JavaWeb中Servlet的生命周期及線程安全問題詳解,Servlet?生命周期可被定義為從創(chuàng)建直到毀滅的整個過程,Servlet體系結構是建立在Java多線程機制之上的,它的生命周期是由Web容器負責的,需要的朋友可以參考下

一、Servlet的生命周期

Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個過程。

它分為四個階段:

  1. Servlet容器創(chuàng)建Servlet的實例。
  2. 該容器調用init ( ServletConfig )方法。
  3. Servlet 調用service()方法來處理客戶端的請求。
  4. Servlet 銷毀前調用destroy()方法。

1、加載Servlet

Servlet生命周期的第一個階段是通過Servlet容器來實現加載以及初始化。

Servlet容器加載所執(zhí)行的操作:

(1)加載Servlet類

(2)創(chuàng)建Servlet并實例化

2、init() 方法

init 方法被設計成只調用一次。它在第一次創(chuàng)建 Servlet 時被調用,在后續(xù)每次用戶請求時不再調用。因此,它是用于一次性初始化。

當用戶調用一個 Servlet 時,就會創(chuàng)建一個 Servlet 實例,每一個用戶請求都會產生一個新的線程,適當的時候移交給 doGet 或 doPost 方法。init() 方法簡單地創(chuàng)建或加載一些數據,這些數據將被用于 Servlet 的整個生命周期。

init 方法的定義如下:

public void init() throws ServletException {
  // 初始化代碼...
}

3、service() 方法

service() 方法是執(zhí)行實際任務的主要方法。Servlet 容器(即 Web 服務器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,并把格式化的響應寫回給客戶端。

每次服務器接收到一個 Servlet 請求時,服務器會產生一個新的線程并調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),并在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。

下面是該方法的特征:

public void service(ServletRequest request, ServletResponse response) 
      throws ServletException, IOException{
}

4、destroy() 方法

destroy() 方法只會被調用一次,在 Servlet 生命周期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉數據庫連接、停止后臺線程、把 Cookie 列表或點擊計數器寫入到磁盤,并執(zhí)行其他類似的清理活動。

destroy 方法定義如下所示:

  public void destroy() {    // 終止化代碼...  }

5、下圖顯示了一個典型的 Servlet 生命周期方案:

二、Servlet的線程安全問題

要了解Servlet的線程安全問題,我們首先要了解Servlet的多線程機制。

1、Servlet的多線程機制

Servlet體系結構是建立在Java多線程機制之上的,它的生命周期是由Web容器負責的。當客戶端第一次請求某個Servlet時,Servlet容器將會根據web.xml配置文件實例化這個Servlet類。當有新的客戶端請求該 Servlet時,一般不會再實例化該Servlet類,也就是有多個線程在使用這個實例。Servlet容器會自動使用線程池等技術來支持系統(tǒng)的運行。

這樣,當兩個或多個線程同時訪問同一個Servlet時,可能會發(fā)生多個線程同時訪問同一資源的情況,數據可能會變得不一致。

所以在用Servlet構建的Web應用時如果不注意線程安全的問題,會使所寫的Servlet程序有難以發(fā)現的錯誤。

2、Servlet的線程安全問題

Servlet是線程不安全的。

Servlet的線程安全問題主要是由于實例變量使用不當而引起的。因為它默認是單例模式,如果提供成員變量,多個線程對成員變量進行操作,將發(fā)生并發(fā)問題。

3、如何解決Servlet的線程安全問題

  • 如果某個Servlet實現了SingleThreadModel接口,那么Servlet引擎將以單線程模式來調用其service方法。但是本質上面并沒有解決線程安全問題,因為其采用的方式是根據并發(fā)請求去產生多個Servlet實例對象,并發(fā)的每個線程分別調用一個獨立的Servlet實例對象,而真正意義上解決多線程安全問題是指一個Servlet實例對象被多個線程同時調用的問題。而不是多個線程調用多個Servlet實例。
  • 利用synchronized同步代碼,將我們有并發(fā)問題的代碼轉化為同步代碼,但是這樣做的一個壞處就是,如果遇到高并發(fā)的情況下,我們的用戶可能會因為同步代碼的問題而造成等待的時間比較久這樣的問題,所以,要慎用。
  • 減少引起并發(fā)問題的資源代碼,從根本上解決Servlet線程安全問題,其實,造成Servlet線程的問題好多都是因為變量設置不正確造成的,我們應該盡可能去避免這樣的問題。

4、總結

  • servlet是線程不安全的,而造成這種原因主要是以為實例變量不正確的使用。
  • 盡量不使用synchronized來解決Servlet線程安全問題
  • Servlet的線程安全問題只有在大量的并發(fā)訪問時才會顯現出來,并且很難發(fā)現,因此在編寫Servlet程序時要特別注意。線程安全問題主要是由實例變量造成的,因此在Servlet中應避免使用實例變量。如果應用程序設計無法避免使用實例變量,那么使用同步來保護要使用的實例變量,但為保證系統(tǒng)的最佳性能,應該同步可用性最小的代碼路徑。

到此這篇關于JavaWeb中Servlet的生命周期及線程安全問題詳解的文章就介紹到這了,更多相關Servlet的生命周期及線程安全內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

聂荣县| 林甸县| 台南县| 英山县| 库车县| 常州市| 柏乡县| 东乡| 永丰县| 广灵县| 湟中县| 澄城县| 丹阳市| 永德县| 弥渡县| 德钦县| 永新县| 上高县| 台中县| 盱眙县| 进贤县| 察哈| 万载县| 普宁市| 张家港市| 锦州市| 栾川县| 呼图壁县| 宁安市| 二手房| 芷江| 弥渡县| 肇州县| 安泽县| 渭南市| 寻乌县| 白玉县| 大冶市| 吉林市| 乌兰浩特市| 山阴县|