大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> 编写线程安全的JSP程序

编写线程安全的JSP程序

时间: 2021-07-31 作者:daque

作家:徐春金

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 namestring 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文献中加上: <%@ page isthreadsafe="false" %>,使它以单线程办法实行,这时候,仍旧惟有一个范例,一切存户端的乞求以串行方 式实行。如许会贬低体例的本能.

对因变量savebuy()加synchronized举行线程同步,该jsp仍旧以多线程办法实行,但也会贬低体例的本能public synchronized void savebuy() {        ...... }

沿用限制变量包办范例变量,因变量savebuy()证明如次: 由于在savebuy()中运用的是传给他的形参,是在仓库中调配的,以是是线程安定的.public void savebuy(string name,string product, int quantity){      ......}挪用办法改为: <%string namestring 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会贬低体例的本能.多线程题目普遍惟有到处大并发量考察时,才有大概展示,而且很难反复展示,以是应在编制程序时就功夫提防。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.