国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何證明Servlet是單例的?

這篇具有很好參考價(jià)值的文章主要介紹了如何證明Servlet是單例的?。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Servlet是web體系里面最重要的部分,下面羅列幾道常見的面試題,小伙伴們一定要好好記住哈。

1.Servlet是單例的嗎,如何證明?

Servlet一般都是單例的,并且是多線程的。如何證明Servlet是單例模式呢?很簡單,重寫Servlet的init方法,或者添加一個(gè)構(gòu)造方法。然后,在web.xml中配置。如:

<?xml?version="1.0"?encoding="UTF-8"?>
<web-app?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns="http://xmlns.jcp.org/xml/ns/javaee"?xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee?http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"?id="WebApp_ID"?version="3.1">
??

??<servlet>
????<servlet-name>MyServlet</servlet-name>
????<servlet-class>web.MyServlet</servlet-class>
??</servlet>
??<servlet-mapping>
????<servlet-name>MyServlet</servlet-name>
????<url-pattern>/hello</url-pattern>
??</servlet-mapping>

</web-app>

然后是MyServlet

public?class?MyServlet?extends?HttpServlet{
?
?public?MyServlet(){
??System.out.println("MyServlet構(gòu)造函數(shù)調(diào)用了");
?}

?@Override
?public?void?init()?throws?ServletException?{
??System.out.println("MyServlet初始化");
?}
?
?

}

啟動(dòng)Tomcat,不管你訪問多少次這個(gè)Servlet,init方法和構(gòu)造器都只會(huì)執(zhí)行1次。

2.如何讓Servlet變成多例

方法1.實(shí)現(xiàn) SingleThreadModel 接口(不推薦,官方已經(jīng)將這個(gè)接口廢棄)

public?class?MyServlet?extends?HttpServlet?implements?SingleThreadModel{
?
?public?MyServlet(){
??System.out.println("MyServlet構(gòu)造函數(shù)調(diào)用了");
?}

?@Override
?public?void?init()?throws?ServletException?{
??System.out.println("MyServlet初始化");
?}

}

SingleThreadModel的意思是“單線程模式”,如果servlet實(shí)現(xiàn)了該接口,會(huì)確保不會(huì)有兩個(gè)線程同時(shí)執(zhí)行servlet的service方法。

servlet容器通過同步化訪問servlet的單實(shí)例來保證,也可以通過維持servlet的實(shí)例池,對于新的請求會(huì)分配給一個(gè)空閑的servlet。源碼中,最多會(huì)生成20個(gè)實(shí)例。

方法2. 在web.xml中多配置一個(gè)Servlet

哪怕是同一個(gè)Servlet,你在web.xml中配置幾個(gè),就會(huì)有幾個(gè)實(shí)例。

3.你能證明Servlet線程不安全嗎?

Servlet默認(rèn)是線程不安全的!

Servlet體系結(jié)構(gòu)是建立在Java多線程機(jī)制之上的,它的生命周期是由Web容器負(fù)責(zé)的。

當(dāng)客戶端第一次請求某個(gè)Servlet時(shí),Servlet容器將會(huì)根據(jù)web.xml配置文件實(shí)例化這個(gè)Servlet類。

當(dāng)有新的客戶端請求該Servlet時(shí),一般不會(huì)再實(shí)例化該Servlet類,也就是有多個(gè)線程在使用這個(gè)實(shí)例。

Servlet容器會(huì)自動(dòng)使用線程池等技術(shù)來支持系統(tǒng)的運(yùn)行。

當(dāng)兩個(gè)或多個(gè)線程同時(shí)訪問同一個(gè)Servlet時(shí),可能會(huì)發(fā)生多個(gè)線程同時(shí)訪問同一資源的情況,數(shù)據(jù)可能會(huì)變得不一致。

所以在用Servlet構(gòu)建的Web應(yīng)用時(shí)如果不注意線程安全的問題,會(huì)使所寫的Servlet程序有難以發(fā)現(xiàn)的錯(cuò)誤。

下面舉一個(gè)例子來說明,為什么Servlet是線程不安全的。

public?class?MyServlet?extends?HttpServlet{
?
?String?message;

?@Override
?protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp)?throws?ServletException,?IOException?{
??message?=?req.getParameter("message");
??PrintWriter?out?=?resp.getWriter();
??//故意延時(shí)5秒鐘,使得下一次請求過來的時(shí)候,message的值還沒有返回就被覆蓋了
??try?{
???Thread.sleep(5000);
??}?catch?(InterruptedException?e)?{
???e.printStackTrace();
??}
??out.write(message);
??out.flush();
??out.close();
??
?}


}

打開兩個(gè)瀏覽器,分別訪問:

http://localhost:8080/web/hello?message=jack

http://localhost:8080/web/hello?message=rose

因?yàn)橛?秒的延時(shí),所以可能就會(huì)出現(xiàn)第一個(gè)Servlet還沒返回呢,第二個(gè)Servlet就進(jìn)來了。于是,把message的值給沖掉了。如下圖

石錘了,Servlet是線程不安全的。

4.你怎么設(shè)計(jì)一個(gè)線程安全的Servlet?

1.最直接的辦法,就是用上面的SingleThreadModel接口

既然單例會(huì)有共享實(shí)例變量導(dǎo)致線程不安全的問題,那就改成多例的唄。

但是,這個(gè)接口都已經(jīng)被官方廢棄了,這就說明官方也不推薦這么做。原因很簡單,那就是這樣一來會(huì)有很多個(gè)實(shí)例,性能的代價(jià)太大了。

  1. 用同步鎖

這也是非常容易想到的辦法,把當(dāng)前對象鎖起來,不返回不給其他用戶插入(怎么有點(diǎn)怪怪的?)

@Override
protected?void?doGet(HttpServletRequest?req,?HttpServletResponse?resp)?throws?ServletException,?IOException?{
?
?synchronized(this){
??message?=?req.getParameter("message");
??PrintWriter?out?=?resp.getWriter();
??//故意延時(shí)5秒鐘,使得下一次請求過來的時(shí)候,message的值還沒有釋放
??try?{
???Thread.sleep(5000);
??}?catch?(InterruptedException?e)?{
???e.printStackTrace();
??}
??out.write(message);
??out.flush();
??out.close();
?
?}
?
}

這樣的代價(jià)就是等待時(shí)間更長了,參考火車上的的衛(wèi)生間,這就是同步鎖。文章來源地址http://www.zghlxwxcb.cn/news/detail-458701.html

  1. 盡量別用實(shí)例變量,用局部變量代替

到了這里,關(guān)于如何證明Servlet是單例的?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Controller是單例還是多例?

    Controller是單例還是多例? controller默認(rèn)是單例的,不要使用非靜態(tài)的成員變量,否則會(huì)發(fā)生數(shù)據(jù)邏輯混亂。正因?yàn)閱卫圆皇蔷€程安全的。 我們下面來簡單的驗(yàn)證下: 我們首先訪問 http://localhost:8080/testScope,得到的答案是1; 然后我們再訪問 http://localhost:8080/testScope2,得到

    2024年02月13日
    瀏覽(14)
  • 不是單例的單例——巧用ClassLoader

    本文通過如何將一個(gè)單例類實(shí)例化兩次的案例,用代碼實(shí)踐來引入 Java 類加載器相關(guān)的概念與工作機(jī)制。理解并熟練掌握相關(guān)知識(shí)之后可以擴(kuò)寬解決問題的思路,另辟蹊徑,達(dá)到目的。 單例模式是最常用的設(shè)計(jì)模式之一。其目的是保證一個(gè)類在進(jìn)程中僅有一個(gè)實(shí)例,并提供一

    2024年02月04日
    瀏覽(20)
  • 【設(shè)計(jì)模式學(xué)習(xí)1】什么是單例模式?單例模式的幾種實(shí)現(xiàn)。

    【設(shè)計(jì)模式學(xué)習(xí)1】什么是單例模式?單例模式的幾種實(shí)現(xiàn)。

    單例模式是在內(nèi)存中只創(chuàng)建一個(gè)對象的模式,它保證一個(gè)類只有一個(gè)實(shí)例。 如上圖所示,多線程情況下,在時(shí)刻T,線程A和線程B都判斷single為null,從而進(jìn)入if代碼塊中都執(zhí)行了new Single()的操作創(chuàng)建了兩個(gè)對象,就和我們當(dāng)初的單例初衷相悖而行。 1、第一次判空目的:為了縮

    2024年02月15日
    瀏覽(20)
  • 單例的例子

    2024年02月07日
    瀏覽(15)
  • QT單例的簡單使用

    單例的.h文件 單例的.cpp文件 使用單例的.cpp代碼

    2024年02月16日
    瀏覽(14)
  • 【設(shè)計(jì)模式】單例模式、“多例模式”的實(shí)現(xiàn)以及對單例的一些思考

    【設(shè)計(jì)模式】單例模式、“多例模式”的實(shí)現(xiàn)以及對單例的一些思考

    單例模式是設(shè)計(jì)模式中最簡單的一種,對于很多人來說,單例模式也是其接觸的第一種設(shè)計(jì)模式,當(dāng)然,我也不例外。這種設(shè)計(jì)模式在學(xué)習(xí)、面試、工作的過程中廣泛傳播,相信不少人在面試時(shí)遇到過這樣的問題:“說說你最熟悉的集中設(shè)計(jì)模式”,第一個(gè)脫口而出的就是單

    2024年02月07日
    瀏覽(25)
  • 設(shè)計(jì)模式——C++11實(shí)現(xiàn)單例模式(餓漢模式、懶漢模式),與單例的進(jìn)程

    本文將介紹單例模式,使用C++11實(shí)現(xiàn)多個(gè)版本的單例模式,分析各自的優(yōu)缺點(diǎn)。最后提及如何實(shí)現(xiàn)一個(gè)單例的進(jìn)程。 單例模式屬于創(chuàng)建型模式,提供了一種創(chuàng)建對象的方式。 單例模式確保一個(gè)類只有一個(gè)實(shí)例。通過一個(gè)類統(tǒng)一地訪問這個(gè)實(shí)例。 思想:將構(gòu)造函數(shù)設(shè)置為私有

    2024年02月09日
    瀏覽(22)
  • 面試題百日百刷-HBase中HTable API有沒有線程安全問題,在程序是單例還是多例?

    鎖屏面試題百日百刷,每個(gè)工作日堅(jiān)持更新面試題。 請看到最后就能獲取你想要的, 接下來的是今日的面試題: ? 1. HBase內(nèi)部機(jī)制是什么? Hbase是一個(gè)能適應(yīng)聯(lián)機(jī)業(yè)務(wù)的數(shù)據(jù)庫系統(tǒng) 物理存儲(chǔ):hbase的持久化數(shù)據(jù)是將數(shù)據(jù)存儲(chǔ)在HDFS上。 存儲(chǔ)管理:一個(gè)表是劃分為很多region的,

    2023年04月08日
    瀏覽(28)
  • day42-servlet下拉查詢/單例模式

    day42-servlet下拉查詢/單例模式

    1.Servlet 實(shí)現(xiàn)下拉查詢(兩表) 2. 單例模式 1.實(shí)戰(zhàn) 1.1? 創(chuàng)建工程,準(zhǔn)備環(huán)境... 1.2? 接口 1.3? 重寫方法 1.4? servlet 1.5? list.jsp list.jsp 詳解 2.單例模式 2.1? 餓漢模式:在程序加載時(shí)直接創(chuàng)建對象(私有化,靜態(tài)化),并創(chuàng)建公有的靜態(tài)的(public static)get方法;其他類需要使用時(shí)

    2024年02月16日
    瀏覽(18)
  • 什么是單頁應(yīng)用程序?如何選擇及架構(gòu)、優(yōu)勢和挑戰(zhàn)

    單頁面應(yīng)用程序(Web應(yīng)用程序或網(wǎng)站)僅加載單個(gè)頁面。然后,當(dāng)用戶與Web服務(wù)器交互時(shí),它使用從Web服務(wù)器獲取的新內(nèi)容重寫頁面,而不是為每次交互加載新頁面。 單頁面應(yīng)用程序是一種網(wǎng)站解決方案,可以直接在瀏覽器中呈現(xiàn)JavaScript代碼。它確保用戶在瀏覽網(wǎng)站時(shí)不會(huì)重新

    2024年02月12日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包