ram*_*tel 4 multithreading struts
为什么struts动作类是单例?
实际上我得到的是它是多线程的.但是当有数千个请求执行相同的操作时,我们将同步用于防止线程问题,那么它没有给出良好的性能bcoz线程进入等待状态并且需要时间来进行.
这是从动作类中删除单例的任何方法吗?
欲了解更多信息,请访问:http://rameshsengani.in
小智 22
你问为什么Action类是单例,但我认为你也有一些理解线程安全性的问题,所以我将尝试解释它们.
首先,Struts Action类没有实现为单例,框架只使用它的一个实例.但是因为只有一个实例用于处理所有传入的请求,所以必须注意不要在非线程安全的Action类中执行某些操作.但问题是:默认情况下,Struts Action类不是线程安全的.
线程安全意味着可以在多线程环境中安全地使用一段代码或对象.Action类可以安全地用在多线程环境中,您可以同时在一千个线程中使用它而没有任何问题......即如果您正确实现它.
必须以线程安全的方式对操作进行编程,因为控制器将为多个同时请求共享同一实例.这意味着您应该考虑以下项目进行设计:
实例和静态变量不得用于存储与特定请求的状态相关的信息.它们可用于跨同一操作的请求共享全局资源.
如果这些资源需要保护,则必须同步对其他资源(JavaBeans,会话变量等)的访问.(但一般情况下,资源类应设计为在必要时提供自己的保护.
您可以通过派生Struts Action并创建自己的Struts Action来使用它.当您这样做时,您必须注意遵守上述规则.这意味着像这样的NO-NO:
public class MyAction extends Action {
private Object someInstanceField;
public ActionForward execute(...) {
// modify someInstanceField here without proper synchronization ->> BAD
}
}
Run Code Online (Sandbox Code Playgroud)
您不需要同步Action类,除非您在上面的代码中做错了.问题是执行到您的操作的入口点是execute方法.
该方法接收它所需的全部参数.您可以在execute方法中同时执行一千个线程而不会出现问题,因为每个线程都有自己的方法调用执行堆栈,但不包含堆中的数据(如someInstanceField)在所有线程之间共享.
如果没有适当的同步,修改someInstanceField所有线程将随意使用它.
所以,是的,Struts的1 Action类不是线程安全的,但是这是你不能安全地存储在其中的状态(statefulf iemake他们)的感觉,或者如果你做到这一点,必须正确同步.
但是如果你保持你的Action类实现无状态,你就可以了,不需要同步,线程也不会等待.
为什么struts动作类是单例?
这是设计的.JavaDoc再次解释了它:
Action是传入HTTP请求的内容与应该执行以处理此请求的相应业务逻辑之间的适配器
请求参数与Web层相关联,您不希望将这种类型的数据发送到业务逻辑类中,因为这会在两个层之间创建紧密耦合,从而无法轻松地重用业务层.
因为将Web对象转换为模型对象(我并不是指ActionForm bean)应该是Action类的主要目的,所以它们不需要维护任何状态(并且不应该),并且没有理由有这些家伙的更多实例,都做同样的事情.只有一个人会这样做.
如果您希望通过将信息保存到数据库中,可以安全地维护模型中的状态,或者您可以使用http会话维护Web状态.在Action类中维护状态是错误的,因为这引入了如上所述的同步化的需要.
有没有办法从动作类中删除单例?
我想你可以扩展Struts并覆盖RequestProcessor.processActionCreate的默认行为,为每个请求自己创建一个Action,但这意味着在Struts之上添加另一个层来改变它的"正常"行为.我已经看到这样的东西在一些应用程序中变坏了所以我不推荐它.
我的建议是让你的Action类保持无状态,并选择为它创建的单个实例.
如果你的应用是新的,你绝对需要有状态的动作,我想你可以去Struts 2(他们改变了那里的设计,现在每个请求都有一个Action实例). 但是Struts 2与Struts 1非常不同,所以如果你的app很旧,那么迁移到Struts 2可能很困难.
希望现在能说清楚.
| 归档时间: |
|
| 查看次数: |
13482 次 |
| 最近记录: |