a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > JSP > 正文

編寫線程安全的JSP應(yīng)用程序

2024-09-05 00:20:42
字體:
供稿:網(wǎng)友

  jsp默認是以多線程方式執(zhí)行的,這是jsp與asp,php,perl等腳本語言不一樣的地方,也是它的優(yōu)勢之一,但如果不注意多線程中的同步問題,會使所寫的jsp程序有難以發(fā)現(xiàn)的錯誤。下面以一個例子說明jsp中的多線程問題及解決方法。

  一、jsp的中存在的多線程問題:

  當(dāng)客戶端第一次請求某一個jsp文件時,服務(wù)端把該jsp編譯成一個class文件,并創(chuàng)建一個該類的實例,然后創(chuàng)建一個線程處理client端的請求。如果有多個客戶端同時請求該jsp文件,則服務(wù)端會創(chuàng)建多個線程。每個客戶端請求對應(yīng)一個線程。以多線程方式執(zhí)行可大大降低對系統(tǒng)的資源需求,提高系統(tǒng)的并發(fā)量及響應(yīng)時間.對jsp中可能用的的變量說明如下:

  實例變量

  實例變量是在堆中分配的,并被屬于該實例的所有線程共享,所以不是線程安全的。

  jsp系統(tǒng)提供的8個類變量,jsp中用到的out,request,response,session,config,page,pageconxt是線程安全的,application在整個系統(tǒng)內(nèi)被使用,所以不是線程安全的。

  局部變量

  局部變量在堆棧中分配,因為每個線程都有它自己的堆棧空間,所以是線程安全的。

  靜態(tài)類

  靜態(tài)類不用被實例化,就可直接使用,也不是線程安全的。

  外部資源:

  在程序中可能會有多個線程或進程同時操作同一個資源(如:多個線程或進程同時對一個文件進行寫操作).此時也要注意同步問題。

  二、下面的例子存在的多線程問題:

  <%@ page import="
javax.naming.*,
java.util.*,
java.sql.*,
weblogic.common.*
" %>
<%
string name
string product;
long quantity;
name=request.getparameter("name");
product=request.getparameter("product");
quantity=request.getparameter("quantity"); /*(1)*/
savebuy();
%>
<%!
public void savebuy()
{
 /*進行數(shù)據(jù)庫操作,把數(shù)據(jù)保存到表中*/
 try {
  properties props = new properties();
  props.put("user","scott");
  props.put("password","tiger");
  props.put("server","demo");
  driver mydriver = (driver) iver").newinstance();
  conn = mydriver.connect("jdbc:weblogic:oracle", props);
  stmt = conn.createstatement();
  string inssql = "insert into buy(empid, name, dept) values (?, ?, ?,?)";
  stmt = conn.preparestatement(inssql);
  stmt.setstring(1, name);
  stmt.setstring(2, procuct);
  stmt.setint(3, quantity);
  stmt.execute();
 }
 catch (exception e)
 {
  system.out.println("sqlexception was thrown: " + e.getmessage());
 }
 finally //close connections and {
  try {
   if(stmt != null)
    stmt.close();
   if(conn != null)
    conn.close();
  } catch (sqlexception sqle) {
   system.out.println("sqlexception was thrown: " + sqle.getmessage());
  }
 }
}
%>

  上面的程序模擬網(wǎng)上購物中的一部分,把用戶在瀏覽器中輸入的用戶名,購買的物品名稱,數(shù)量保存到表buy中。在savebuy()函數(shù)中用到了實例變量,所以它不是線程安全的。因為:程序中的每一條語句都不是原子操作,如name=request.getparameter("name");在執(zhí)行是會對應(yīng)多個機器指令,在任何時候都可能因系統(tǒng)調(diào)度而轉(zhuǎn)入睡眠狀態(tài),讓其他的線程繼續(xù)執(zhí)行。如果線程a在執(zhí)行到(1)的時候轉(zhuǎn)入睡眠狀態(tài),線程b開始執(zhí)行并改變quantity的值,那么當(dāng)又到a執(zhí)行時,它會從調(diào)用savebuy()函數(shù)開始執(zhí)行,這樣它保存到表中的quantity是被線程b改過的值,那么線程a對應(yīng)的用戶所實際購買的數(shù)量與保持到表中的數(shù)據(jù)不一致,這是個很嚴重的問題。

|||

最大的網(wǎng)站源碼資源下載站,

  三、解決方法

  采用單線程方式

  在該jsp文件中加上: ,使它以單線程方式執(zhí)行,這時,仍然只有一個實例,所有客戶端的請求以串行方 式執(zhí)行。這樣會降低系統(tǒng)的性能。

  對函數(shù)savebuy()加synchronized進行線程同步,該jsp仍然以多線程方式執(zhí)行,但也會降低系統(tǒng)的性能:

  public synchronized void savebuy()
{
......
}

  采用局部變量代替實例變量,函數(shù)savebuy()聲明如下:

  因為在savebuy()中使用的是傳給他的形參,是在堆棧中分配的,所以是線程安全的。

  public void savebuy(string name,string product, int quantity)
{
......
}

  調(diào)用方式改為:

  <%
string name
string product;
long quantity;
name=request.getparameter("name");
product=request.getparameter("product");
quantity=request.getparameter("quantity");
savebuy(name,product,quantity)
%>

  如果savebuy的參數(shù)很多,或這些數(shù)據(jù)要在很多地方用到,也可聲明一個類,并用他做參數(shù),如:

  public class buyinfo
{
 string name;
 string product;
 long quantity;
}
public void savebuy(buyinfo info)
{
 ......
}

  調(diào)用方式改為:

  <%
buyinfo userbuy = new buyinfo();
userbuy.name=request.getparameter("name");
userbuy.product=request.getparameter("product");
userbuy.quantity=request.getparameter("quantity");
savebuy(userbuy);
%>

  所以最好是用3,因為1,2會降低系統(tǒng)的性能。

  多線程問題一般只有在在大并發(fā)量訪問時,才有可能出現(xiàn),并且很難重復(fù)出現(xiàn),所以應(yīng)在編程時就時刻注意。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 日本一区精品 | 99九九久久| 91性高湖久久久久久久久_久久99 | 色老头av | 国产视频网 | 中文字幕亚洲字幕一区二区 | 波多野结衣一区在线观看 | 亚洲天堂av中文字幕 | 久久这 | 天天躁日日躁狠狠很躁 | 欧美一区二区成人 | 欧美视频一区二区在线 | 一区二区三区日韩 | 91精品国产综合久久久久久 | 国产激情在线观看 | 久久国产成人午夜av影院宅 | 日本三级电影天堂 | 午夜精品久久久久久久久久蜜桃 | 国产日韩欧美亚洲 | 国产日韩欧美一区 | 国产视频亚洲精品 | 国产91久久精品一区二区 | 久久黄色| 精品999| 青青久视频 | 国产精品国产 | www.亚洲| 精品一区二区三区在线视频 | 一级黄视频 | 久久欧美精品一区 | 亚洲最黄视频 | 免费视频色 | 日本中文字幕在线播放 | 国产一区二区三区在线免费观看 | 一区二区视频 | 91在线成人 | 羞羞视频在线观看免费 | 成人国产精品久久久 | 天天综合久久 | 在线看91| 日韩一区二区三免费高清在线观看 |