国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

深入研究Servlet線程安全性問題

2019-11-17 06:13:47
字體:
供稿:網(wǎng)友
摘 要:介紹了Servlet多線程機制,通過一個實例并結(jié)合java 的內(nèi)存模型說明引起Servlet線程不安全的原因,給出了保證Servlet線程安全的三種解決方案,并說明三種方案在實際開發(fā)中的取舍。

  要害字:Servlet 線程安全 同步 Java內(nèi)存模型 實例變量

  Servlet/jsp技術(shù)和aspphp等相比,由于其多線程運行而具有很高的執(zhí)行效率。由于Servlet/JSP默認(rèn)是以多線程模式執(zhí)行的,所以,在編寫代碼時需要非常細(xì)致地考慮多線程的安全性問題。然而,很多人編寫Servlet/JSP程序時并沒有注重到多線程安全性的問題,這往往造成編寫的程序在少量用戶訪問時沒有任何問題,而在并發(fā)用戶上升到一定值時,就會經(jīng)常出現(xiàn)一些莫明其妙的問題。

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

深入研究Servlet線程安全性問題
圖1 Servlet線程池

  這樣,當(dāng)兩個或多個線程同時訪問同一個Servlet時,可能會發(fā)生多個線程同時訪問同一資源的情況,數(shù)據(jù)可能會變得不一致。所以在用Servlet構(gòu)建的Web應(yīng)用時假如不注重線程安全的問題,會使所寫的Servlet程序有難以發(fā)現(xiàn)的錯誤。

  Servlet的線程安全問題

  Servlet的線程安全問題主要是由于實例變量使用不當(dāng)而引起的,這里以一個現(xiàn)實的例子來說明。

Import javax.servlet. *;
Import javax.servlet.http. *;
Import java.io. *;
Public class Concurrent Test extends HttpServlet {PRintWriter output;
Public void service (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {String username;
Response.setContentType ("text/Html; charset=gb2312");
Username = request.getParameter ("username");
Output = response.getWriter ();
Try {Thread. sleep (5000); //為了突出并發(fā)問題,在這設(shè)置一個延時
} Catch (Interrupted Exception e){}
output.println("用戶名:"+Username+"
");
}
}

  該Servlet中定義了一個實例變量output,在service方法將其賦值為用戶的輸出。當(dāng)一個用戶訪問該Servlet時,程序會正常的運行,但當(dāng)多個用戶并發(fā)訪問時,就可能會出現(xiàn)其它用戶的信息顯示在另外一些用戶的瀏覽器上的問題。這是一個嚴(yán)重的問題。為了突出并發(fā)問題,便于測試、觀察,我們在回顯用戶信息時執(zhí)行了一個延時的操作。假設(shè)已在web.xml配置文件中注冊了該Servlet,現(xiàn)有兩個用戶a和b同時訪問該Servlet(可以啟動兩個IE瀏覽器,或者在兩臺機器上同時訪問),即同時在瀏覽器中輸入:

  a: http://localhost: 8080/servlet/ConcurrentTest? Username=a


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 田东县| 正定县| 孟连| 集贤县| 顺昌县| 唐海县| 平江县| 商都县| 章丘市| 武陟县| 沙坪坝区| 白河县| 泾阳县| 商城县| 开封县| 鞍山市| 兴仁县| 望奎县| 孝感市| 买车| 景东| 仁布县| 秦皇岛市| 大足县| 衡东县| 昂仁县| 汤阴县| 清苑县| 额敏县| 罗平县| 古蔺县| 岢岚县| 桑植县| 禄劝| 滨州市| 泰来县| 垣曲县| 朔州市| 东明县| 乐清市| 鄂伦春自治旗|