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

首頁 > 編程 > JSP > 正文

編寫線程安全的JSP程序

2019-11-18 20:08:05
字體:
來源:轉載
供稿:網友

作者:徐春金

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

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

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

  1. 實例變量
    實例變量是在堆中分配的,并被屬于該實例的所有線程共享,所以不是線程安全的.
  2. JSP系統提供的8個類變量
    JSP中用到的OUT,REQUEST,RESPONSE,session,CONFIG,PAGE,PAGECONXT是線程安全的,application在整個系統內被使用,所以不是線程安全的.
  3. 局部變量
    局部變量在堆棧中分配,因為每個線程都有它自己的堆??臻g,所以是線程安全的.
  4. 靜態類
    靜態類不用被實例化,就可直接使用,也不是線程安全的.
  5. 外部資源:
    在程序中可能會有多個線程或進程同時操作同一個資源(如:多個線程或進程同時對一個文件進行寫操作).此時也要注意同步問題.

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

<%@ 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對應的用戶所實際購買的數量與保持到表中的數據不一致.這是個很嚴重的問題.

三、解決方法

  1. 采用單線程方式
    在該JSP文件中加上: <%@ page isThreadSafe="false" %>,使它以單線程方式執行,這時,仍然只有一個實例,所有客戶端的請求以串行方 式執行。這樣會降低系統的性能.
  2. 對函數savebuy()加synchronized進行線程同步,該JSP仍然以多線程方式執行,但也會降低系統的性能
    public synchronized void savebuy()
    {
           ......
    }
  3. 采用局部變量代替實例變量,函數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會降低系統的性能.
多線程問題一般只有在在大并發量訪問時,才有可能出現,并且很難重復出現,所以應在編程時就時刻注意。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲毛片在线看| 久久精品国产99国产精品澳门| 日韩在线免费观看视频| 日韩av理论片| 91久久精品国产91久久| 国产精品久久77777| 另类天堂视频在线观看| 欧美精品国产精品日韩精品| 日韩动漫免费观看电视剧高清| 精品久久久香蕉免费精品视频| 国产精品嫩草影院久久久| 91久久久精品| 日韩在线观看成人| 精品国产91乱高清在线观看| 中文字幕亚洲综合| 一区二区三区四区视频| 久久97精品久久久久久久不卡| 久久精品99无色码中文字幕| 91日韩在线视频| 亚洲小视频在线| 性日韩欧美在线视频| 久久精品99久久久久久久久| 日韩高清电影免费观看完整| 色999日韩欧美国产| 色999日韩欧美国产| 久久久精品影院| 97精品久久久中文字幕免费| 亚洲激情视频网站| 亚洲精品久久久久国产| 亚洲欧美制服中文字幕| 欧美在线视频网站| 国产精品爱久久久久久久| 精品国产福利在线| 国产一区二区三区在线视频| 欧美精品aaa| 黄色精品在线看| 欧美xxxx18国产| 午夜精品久久久久久久白皮肤| 国产精品高潮呻吟久久av黑人| 欧美日韩国产中字| 精品一区二区三区四区在线| 久久精品视频免费播放| 色久欧美在线视频观看| 欧美精品免费看| 精品国产精品自拍| 成人在线视频网| 亚洲第一二三四五区| 国产精品av免费在线观看| 亚洲大胆美女视频| 青青青国产精品一区二区| 亚洲精品ady| 久久久国产视频91| 亚洲欧美制服中文字幕| 日韩激情第一页| 久久国产精品免费视频| 日本久久91av| 91美女片黄在线观| 日韩高清中文字幕| 国产精品一区=区| 久久久精品在线观看| 日韩精品极品视频免费观看| 成人黄色影片在线| 欧美一区二区三区四区在线| 国语自产精品视频在免费| 草民午夜欧美限制a级福利片| 最近中文字幕2019免费| 亚洲国产精久久久久久久| 国产精品极品美女在线观看免费| 日韩美女福利视频| 亚洲欧美激情四射在线日| 欧美精品激情视频| 欧美激情一级欧美精品| 国产视频在线一区二区| 国产精品6699| 国产成人鲁鲁免费视频a| 91精品国产综合久久久久久蜜臀| 久久视频中文字幕| 亚洲国产精品女人久久久| 欧美天堂在线观看| 在线看福利67194| 九九热这里只有精品6| 欧美成人午夜影院| 国产精品成人va在线观看| 97人人爽人人喊人人模波多| 美女久久久久久久| 亚洲自拍偷拍在线| 国产女人精品视频| 搡老女人一区二区三区视频tv| 国产精品久久99久久| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美自拍一区| 精品久久久中文| 97**国产露脸精品国产| 亚洲色图35p| 一二美女精品欧洲| 欧美亚洲另类在线| 国产精品视频网| 成人久久精品视频| 久久999免费视频| 亚洲精品午夜精品| 91精品国产乱码久久久久久久久| 欧美成人免费观看| 2019中文在线观看| 久久亚洲综合国产精品99麻豆精品福利| 亚洲男人天堂网站| 欧美成人午夜激情在线| 亚洲老司机av| 成人国产精品久久久| 色黄久久久久久| 日韩av手机在线观看| 77777亚洲午夜久久多人| 亚洲国产日韩欧美在线99| 在线午夜精品自拍| 日韩欧美成人精品| 欧美性猛交xxxxx免费看| 欧美久久精品一级黑人c片| 亚洲人成网站免费播放| 久久精品99久久久香蕉| 人人澡人人澡人人看欧美| 久久免费在线观看| 国产精品亚洲аv天堂网| 亚洲人成网站777色婷婷| 538国产精品一区二区在线| 日韩电影免费观看在线观看| 国产区精品视频| 中文字幕精品影院| 亚洲三级av在线| 国产精品高精视频免费| 久久久国产成人精品| 中文综合在线观看| 亚洲国产精品va在线看黑人| 亚洲三级黄色在线观看| 欧洲永久精品大片ww免费漫画| 亚洲精品视频在线播放| 国产一区二区三区免费视频| 538国产精品一区二区在线| 日韩精品极品毛片系列视频| 一区二区三区国产在线观看| 欧美性猛交xxxx乱大交3| 日本免费一区二区三区视频观看| 中文字幕亚洲无线码在线一区| 欧美精品999| 欧美精品一区二区免费| 欧美激情在线观看| 欧美一区深夜视频| 岛国av午夜精品| 欧美男插女视频| 中文字幕日韩有码| 成人性教育视频在线观看| 国模精品视频一区二区三区| 国产精品欧美激情在线播放| 欧美色videos| 国产亚洲日本欧美韩国| 91精品国产777在线观看| 中文字幕综合一区| 国产免费亚洲高清| 4444欧美成人kkkk| 欧美大胆a视频| 主播福利视频一区| 国产在线视频2019最新视频| 国产欧美一区二区白浆黑人| 国产不卡av在线免费观看| 亚洲国产欧美一区二区丝袜黑人| 国产成人精品综合久久久|