有关Action的线程安全问题

Java 发表评论

拿jsp描述:JSP默认是以多线程方式执行的,这是JSP与ASP,PHP,PERL等脚本语言不一样的地方,也是它的优势之一,但如果不注意多线程中的同步问题,会使所写的JSP程序有难以发现的错误。

引起原因:

(1)实例变量
实例变量是在堆中分配的,并被属于该实例的所有线程共享,所以不是线程安全的.
(2)JSP系统提供的8个类变量
JSP中用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT是线程安全的,APPLICATION在整个系统内被使用,所以不是线程安全的. 
(3)局部变量
局部变量在堆栈中分配,因为每个线程都有它自己的堆栈空间,所以是线程安全的. 
(4)静态类
静态类不用被实例化,就可直接使用,也不是线程安全的.
(5)外部资源:
在程序中可能会有多个线程或进程同时操作同一个资源(如:多个线程或进程同时对一个文件进行写操作).此时也要注意同步问题.

解决方法:

(1)采用单线程方式
在JSP文件中加上<%@ page? isThreadSafe=”false” %>,使它以单线程方式执行,这时,仍然只有一个实例,所有客户端的请求以串行方式执行。这样会降低系统的性能.
(2)对函数加synchronized进行线程同步,JSP仍然以多线程方式执行,但也会降低系统的性能.
(3)采用局部变量代替实例变量

多线程问题一般只有在在大并发量访问时,才有可能出现,并且很难重复出现,所以应在编程时就时刻注意。

就像Servlet一样,每个Action 对象只被实例化一次,所有的客户端请求都会共享这个Action实例,因此在扩展Action时,必须保证其多线程性。也就是说你的Actioin对象必须是线程安全的,这样,客户端的状态就不能存放在Action的实例变量中,只能存放在局部变量中(如Excute()中)。

上一篇:

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *