亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

編寫線程安全的JSP

2024-09-05 00:19:13
字體:
來源:轉載
供稿:網友


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

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

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

實例變量
實例變量是在堆中分配的,并被屬于該實例的所有線程共享,所以不是線程安全的.
jsp系統提供的8個類變量
jsp中用到的out,request,response,session,config,page,pageconxt是線程安全的,application在整個系統內被使用,所以不是線程安全的.
局部變量
局部變量在堆棧中分配,因為每個線程都有它自己的堆棧空間,所以是線程安全的.
靜態類
靜態類不用被實例化,就可直接使用,也不是線程安全的.
外部資源:
在程序中可能會有多個線程或進程同時操作同一個資源(如:多個線程或進程同時對一個文件進行寫操作).此時也要注意同步問題.
二、下面的例子存在的多線程問題:

 

<%@ 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()
{
    /*進行數據庫操作,把數據保存到表中*/
    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());
        }
    }
}
%>

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

三、解決方法

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

對函數savebuy()加synchronized進行線程同步,該jsp仍然以多線程方式執行,但也會降低系統的性能
public synchronized void savebuy()
{
       ......
}

采用局部變量代替實例變量,函數savebuy()聲明如下:
因為在savebuy()中使用的是傳給他的形參,是在堆棧中分配的,所以是線程安全的.
public void savebuy(string name,string product, int quantity)
{
      ......
}

調用方式改為:
<%
string name
string product;
long quantity;
name=request.getparameter("name");
product=request.getparameter("product");
quantity=request.getparameter("quantity");
savebuy(name,product,quantity)
%>


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

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

調用方式改為:
<%
buyinfo userbuy = new buyinfo();

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

 

所以最好是用3,因為1,2會降低系統的性能.
多線程問題一般只有在在大并發量訪問時,才有可能出現,并且很難重復出現,所以應在編程時就時刻注意。


 作者簡介
  dev2dev id: xcjing,bea 資深技術顧問,加入bea中國多年,在門戶技術、rfid解決方案上有著豐富的經驗。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产丝袜一区二区| 久久天天躁狠狠躁夜夜躁2014| 欧美性生交xxxxxdddd| 日韩av在线播放资源| 国产精品成人播放| 日韩视频欧美视频| 日韩一区二区三区在线播放| 欧美做受高潮1| 91精品国产成人www| 欧美性做爰毛片| 97人人模人人爽人人喊中文字| 九九久久久久久久久激情| 日本久久精品视频| 久久精品中文字幕| 国产日韩欧美日韩大片| 成人av电影天堂| 久久色免费在线视频| 91免费国产视频| 欧美亚洲视频在线看网址| 欧美成人全部免费| 精品亚洲永久免费精品| 亚洲精品网址在线观看| 尤物tv国产一区| 91久久久久久久久| 亚洲国产女人aaa毛片在线| 国产999在线观看| 欧美成人亚洲成人日韩成人| 成人国产精品久久久| 欧美中文字幕在线观看| 久久伊人免费视频| 欧美激情小视频| 国产精品99久久久久久www| 91色中文字幕| 国产精品嫩草影院一区二区| 国产一区红桃视频| 精品视频在线观看日韩| 精品亚洲va在线va天堂资源站| 欧美麻豆久久久久久中文| 57pao成人永久免费视频| 国产精品男人的天堂| 狠狠躁夜夜躁人人爽天天天天97| 国产精品成人国产乱一区| 国产日韩欧美综合| 欧美日韩亚洲一区二| 精品亚洲一区二区三区| 91tv亚洲精品香蕉国产一区7ujn| 日韩成人在线视频观看| 国产91色在线|免| 88xx成人精品| 日韩av一区二区在线| 亚洲午夜国产成人av电影男同| 国外色69视频在线观看| 欧美性xxxxx极品娇小| 97超碰国产精品女人人人爽| 国产精品亚洲欧美导航| 18久久久久久| 久久久久久91香蕉国产| 欧美日本高清一区| 久久成人亚洲精品| 777国产偷窥盗摄精品视频| 7777kkkk成人观看| 日韩中文字幕网址| 日韩中文字幕在线免费观看| 97人人做人人爱| 亚洲第一网站免费视频| 亚洲欧美日韩中文视频| 亚洲色无码播放| 国产成人+综合亚洲+天堂| 国产亚洲欧洲在线| 欧美人在线视频| 91av福利视频| 国产精品第一区| 91理论片午午论夜理片久久| 成人午夜激情免费视频| 日韩大胆人体377p| 欧美成人免费全部观看天天性色| 久久网福利资源网站| 日韩一区av在线| 91国语精品自产拍在线观看性色| 麻豆乱码国产一区二区三区| 亚洲国产美女久久久久| 国产美女精品免费电影| 国产成人精品一区二区| 一区二区欧美亚洲| 亚洲午夜小视频| 国产精品视频网址| 日韩精品小视频| 久久人人爽人人爽人人片av高清| 57pao国产精品一区| 97国产精品久久| 亚洲第一区中文99精品| 久久久久久com| 国产精品久久网| 日韩av在线免播放器| 亚洲在线视频福利| 色噜噜狠狠狠综合曰曰曰88av| 国产精品扒开腿做爽爽爽视频| 动漫精品一区二区| 国产欧洲精品视频| 久久久这里只有精品视频| 欧美性生交xxxxx久久久| 国产成人综合一区二区三区| 国产亚洲免费的视频看| 欧美日韩精品在线播放| 久久久久久91| 最近2019中文字幕mv免费看| 国产成人精品在线| 国产美女扒开尿口久久久| 国产视频在线观看一区二区| 久久精品这里热有精品| 国产成人福利网站| 最近日韩中文字幕中文| 亚洲码在线观看| 亚洲自拍偷拍在线| 国产精品久久久久久五月尺| 久久亚洲精品一区二区| 久久久久这里只有精品| 亚洲韩国青草视频| 国产在线98福利播放视频| 国产精品99久久久久久久久| 97精品视频在线观看| 国产一区二区三区在线看| 奇米四色中文综合久久| 精品美女永久免费视频| 欧美大奶子在线| 日本不卡高字幕在线2019| 欧美激情2020午夜免费观看| 在线观看日韩www视频免费| 国产一区二区三区在线观看网站| 91久久精品久久国产性色也91| 成人信息集中地欧美| 国产精品成人品| 久久综合九色九九| 国产精品av在线| 精品国产91乱高清在线观看| 日韩成人在线视频网站| 亚洲激情视频在线| 国产精品中文字幕在线| 欧美在线观看www| 91免费电影网站| 国产成人精品午夜| 日韩av色综合| 中文字幕欧美在线| 8x拔播拔播x8国产精品| 成人日韩av在线| 91天堂在线视频| 性色av一区二区三区在线观看| 国产做受69高潮| 在线看片第一页欧美| 欧美孕妇孕交黑巨大网站| 精品视频久久久| 国产成人精品最新| 日本在线精品视频| 精品国偷自产在线视频99| 热门国产精品亚洲第一区在线| 欧美性感美女h网站在线观看免费| 日韩欧美国产成人| 国产99久久久欧美黑人| 欧美精品aaa| 亚洲美女视频网| 亚洲大胆人体视频| 国产精品扒开腿做爽爽爽视频| 亚洲人成在线观看| 成人写真视频福利网|