配色: 字号:
Servlet线程安全
2012-06-26 | 阅:  转:  |  分享 
  
今天遇到了一个复god,看来平

现象:

单线程访问时,应用程序都正常。

多人并



Servlet/JSP技ASP、PHP等相比,由于其多而具有很高的Servlet/JSP默Servlet/JSP程序

第一,Servlet的多线程机制

Servlet体系Java多Web容器当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自1所示。

?????

1Servlet线程池

这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的WebServlet程序有

???第二,Servlet的

???Servlet的

publicclassJExcelInputImplimplementsJExcelInput{



??????privateConnectionconn;//实例变量

publicListaddUpdateImport(String…)throwsException{



conn=DBUtil.getConnection(transactionManager);



} ????该Servlet中定conn,在addUpdateImport方法将其getConnection。当一个用Connection。

???下面我,观察不同时刻实例变量conn的

????Java的内存模型JMM(JavaMemoryModel)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的(MainMemory),Java中所有每条线程都有自己的工作内存(WorkingMemory),工作内存由JMM,我Servlet实例的内存模型抽象2所示的模型。

???????????

???????????????????2JMM模型

???当conn在B线程对实例变量conn的修改覆盖了Aconn的修改,从而A的

??第三,Servlet

???通Servlet线程不安全的主要原因。下面针对该问题给出了三种解决方案:

???1、SingleThreadModel接口

???Servlet的Servlet被,那么在Servlet中的service方法将不会有两个?implementsSingleThreadMode就可以了。

???2、?同步

???使用synchronized关

???3、?避免使用

???线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用Servlet就是?

publicclassJExcelInputImplimplementsJExcelInput{



publicListaddUpdateImport(String…)throwsException{

??Connectionconn=null;//局部



conn=DBUtil.getConnection(transactionManager);



} ???从Java内存模型可以知道,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全,这也是最佳方法。

??第四,

???线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写程序时要特别注意。线程安全问题主要是由实例变量造成的,因此

???实例变量:

???实例变量是在堆中分配的,并被属于.?

???JSP系

???JSP中用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT是线程安全的,APPLICATION在整个系,所以不是.?

???局部

???局部,因,所以是.?

???静态类:

???静,就可直接使用,也不是.?

???外部

???在程序中可能会有多个(如:多个).此.

???Tips:不要在action里用实例变量



献花(0)
+1
(本文系真的_!首藏)