servlet的自動(dòng)加載
????????默認(rèn)情況下,當(dāng)?shù)谝淮卧L問servlet的時(shí)候創(chuàng)建servlet對(duì)象谍失。如果servlet的構(gòu)造方法或者init的方法中執(zhí)行了比較多的邏輯代碼,那么會(huì)導(dǎo)致第一次訪問servlet的時(shí)候比較慢。
????????這時(shí)侯我們只需要改變servlet創(chuàng)建的時(shí)機(jī)棺榔,提前到加載web應(yīng)用的時(shí)候。只需要在servlet配置信息中隘道,加上<load-on-startup>即可。<load-on-startup>標(biāo)簽中的值是整數(shù)的,多個(gè)<load-on-startup>標(biāo)簽糟需,數(shù)字越大旅赢,優(yōu)先級(jí)越低。
servlet的并發(fā)問題
????????因?yàn)閟ervlet是多線程的激捏,所以當(dāng)多個(gè)servlet的線程同時(shí)訪問了servlet的共享資源设塔,比如說:成員變量,就會(huì)引發(fā)servlet的安全問題缩幸。下面將舉例說明:
線程1執(zhí)行壹置,緊接著線程2執(zhí)行,線程1還沒執(zhí)行count++,就會(huì)出現(xiàn)線程問題了表谊。
public class ThreadServlet extends HttpServlet {
int count = 1;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你現(xiàn)在是第"+count+"個(gè)訪客");
count++;
}
}
????????這時(shí)候只需要把使用到共享數(shù)據(jù)的代碼塊進(jìn)行同步(使用synchronized關(guān)鍵字進(jìn)行同步)钞护。建議在servlet類中盡量不要使用成員變量。如果確實(shí)要使用成員爆办,必須同步难咕。而且盡量縮小同步代碼塊的范圍。(哪里使用到了成員變量距辆,就同步哪里S嗟琛!)跨算,以避免因?yàn)橥蕉鴮?dǎo)致并發(fā)效率降低爆土。
代碼展示如下:
int count = 1;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
synchronized (ThreadServlet.class){//鎖對(duì)象必須是唯一的
response.getWriter().write("你現(xiàn)在是第"+count+"個(gè)訪客");
count++;}
}
運(yùn)行效果: