`
i_am_birdman
  • 浏览: 282602 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Jsp 多线程

阅读更多
JSP多线程

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. 局部变量
    局部变量在堆栈中分配,因为每个线程都有它自己的堆栈空间,所以是线程安全的.
  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文件中加上: ,使它以单线程方式执行,这时,仍然只有一个实例,所有客户端的请求以串行方 式执行。这样会降低系统的性能.
  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会降低系统的性能.
多线程问题一般只有在在大并发量访问时,才有可能出现,并且很难重复出现,所以应在编程时就时刻注意。

分享到:
评论

相关推荐

    jsp 多线程学习有关源码

    jsp多线程学习教程源码,有兴趣的看看啊,不足的地方还见谅啊

    jsp写的多线程下载 源代码

    【标题】"jsp写的多线程下载 源代码"主要涉及的是在Java服务器页面(JSP)中实现多线程技术来优化大文件下载的效率。多线程下载是通过将一个大文件分割成多个小部分,然后同时启动多个线程分别下载这些部分,以提高...

    Java多线程程序设计-JSP教程,Java技巧及代码

    Java多线程程序设计是Java开发中的重要概念,它允许在一个程序中同时执行多个任务,提高了应用程序的效率和响应性。在Java中,有两种主要的方式来实现多线程:继承Thread类和实现Runnable接口。 首先,我们要理解多...

    JSP进度条使用线程制作

    本项目"JSP进度条使用线程制作"正是为了解决这个问题,它展示了如何通过多线程技术在JSP中实现一个动态更新的进度条。 首先,我们需要理解线程的概念。在Java中,线程是程序执行的最小单元,每个线程都有自己的程序...

    jsp线程学习上课代码

    9. **JSP内置对象与线程安全**:JSP的内置对象(如`session`, `request`, `response`)不是线程安全的,因此在多线程环境下使用它们时,需格外小心。 10. **设计模式**:如单例模式用于保证一个类只有一个实例,...

    vc源码,多线程示例

    标题中的"vc源码,多线程示例"表明这是一个关于使用Visual C++(简称VC)进行多线程编程的源代码示例。在Windows环境下,VC是Microsoft开发的一个集成开发环境,它支持C++语言,可以用于创建各种类型的Windows应用...

    Python多线程超大日志文件解析转储写入mysql/postgresql

    Python多线程超大日志文件解析转储,实现几十G超大文件并发处理。 实现功能如下: 1.多线程分块解析某超大日志文件,实现超大文件多线程分块处理 2.多线程写入数据到数据库postgresql/mysql 3.线程之间通过队列queue...

    多线程双图片源下载jsp

    在IT行业中,多线程和图片下载是两个关键的技术领域,尤其在Web开发中,如JSP(JavaServer Pages)应用程序。"多线程双图片源下载jsp"这个实例展示了如何利用多线程技术从Google和Flickr这两个知名的图片服务平台上...

    WEB多线程开发

    由于Servlet本质是多线程的,因此JSP天生支持多线程操作。在处理并发请求时,JSP和其背后的Servlet容器(如Tomcat)会利用多线程来提高性能。 2. **Servlet**:Servlet是Java编写的小型服务器端程序,用于扩展...

    socket长连接多线程支持客户端服务端互发消息

    socket长连接多线程支持客户端服务端互发消息 运行多个TUClient在控制台输入消息 消息格式如下:TA CM 114 :54089999000100000004|12|201002031029; 54089999000100000004代表客户端标识,每登录成功一个客户端将在...

    tomcat中多线程对于servlet处理的4篇资料

    它基于Servlet和JSP规范,对于处理HTTP请求,Tomcat采用了多线程模型来提升性能。在这个主题中,我们将深入探讨"Tomcat中多线程对于Servlet处理"的相关知识点,特别关注在5.5.17版本中的实现。 1. **Tomcat的线程...

    实现多线程编程.rar

    5. **JSP中的多线程**:在Java Server Pages(JSP)中,虽然JSP本身不是多线程的,但它们运行在Servlet容器中,而Servlets是多线程的。每个HTTP请求都会在单独的线程中处理,因此理解如何在Servlet中正确地管理线程...

    JSP多文件上传(同时上传)

    对于大量文件上传,可能需要考虑分块上传、多线程处理等策略,以提高上传效率。 10. **前端验证**: 在客户端进行初步验证,如限制文件数量、大小等,可以减少无效的服务器请求。 总的来说,JSP多文件上传涉及...

    编写线程安全的JSP程序

    在JSP(Java Server Pages)开发中,理解并处理多线程问题是至关重要的,因为这直接影响到程序的正确性和性能。JSP默认是以多线程的方式执行,这意味着多个客户端请求同一JSP页面时,服务器会为每个请求创建一个新的...

    JSP核心技术——JSP引擎内幕(2010).pdf

    理解JSP引擎的工作原理及其关键技术,如JSP页面的转换与编译机制、多线程与持久性等,对于成为一名优秀的JSP开发者至关重要。掌握这些核心概念不仅可以帮助开发者写出更高效、可靠的代码,还能更好地应对复杂的Web...

    多线程文件下载

    在IT领域,多线程文件下载是一种常见的优化技术,它能显著提高大文件的下载速度。这个项目专注于利用多线程技术实现文件的高效下载,同时支持断点续传功能,确保用户即使在网络不稳定的情况下也能顺利完成下载。接...

    JSP教案文档

    1. **多线程**:在JSP应用中,多线程是必不可少的一部分。多线程允许多个任务同时执行,提高服务器性能。在`多线程.doc`中,可能讲解了如何在JSP中创建和管理线程,以及线程同步和通信的方法,如synchronized关键字...

    人工智能-项目实践-多线程-多线程网站目录穷举扫描修改版.zip

    人工智能-项目实践-多线程-多线程网站目录穷举扫描修改版 使用方法 python dirfuzz.py www.wooyun.org php python dirfuzz.py www.wooyun.org asp python dirfuzz.py www.wooyun.org jsp

    JavaEE学习[JavaSE-06多线程.rar]

    在JavaEE的学习过程中,多线程是不可或缺的一部分,尤其对于服务器端应用来说,多线程能够有效地利用系统资源,提高程序的并发处理能力。 多线程是Java编程中的核心概念,它允许一个程序同时执行多个任务。在Java中...

Global site tag (gtag.js) - Google Analytics