Multithreading struts动作单体

Multithreading struts动作单体,multithreading,struts,Multithreading,Struts,为什么struts操作类是singleton 事实上,我明白了它是多线程的。但当上千个请求命中同一个操作时,为了防止线程问题,我们将其放入了synchronized,然后bcoz线程进入等待状态并没有提供良好的性能,这需要时间来处理 这是从action类中删除singleton的方法吗 有关更多信息,请访问:我对struts了解不多,但似乎您应该切换到?您正在询问为什么Action类是singleton,但我认为您在理解线程安全性方面也存在一些问题,因此我将尝试解释这两个方面 首先,Struts

为什么struts操作类是singleton

事实上,我明白了它是多线程的。但当上千个请求命中同一个操作时,为了防止线程问题,我们将其放入了synchronized,然后bcoz线程进入等待状态并没有提供良好的性能,这需要时间来处理

这是从action类中删除singleton的方法吗


有关更多信息,请访问:

我对struts了解不多,但似乎您应该切换到?

您正在询问为什么Action类是singleton,但我认为您在理解线程安全性方面也存在一些问题,因此我将尝试解释这两个方面

首先,Struts操作类不是作为单例实现的,框架只使用它的一个实例。但是,由于只使用一个实例来处理所有传入的请求,因此必须注意不要在Action类中处理线程不安全的内容。但问题是:默认情况下,Struts操作类不是线程安全的

意味着一段代码或对象可以在多线程环境中安全使用。一个Action类可以安全地在多线程环境中使用,并且您可以让它同时在上千个线程中使用,而不会出现任何问题。。。如果您正确地实施它,这就是

从:

操作必须以线程安全的方式进行编程,因为控制器将为多个同时请求共享同一实例。这意味着您在设计时应考虑以下事项:

  • 实例和静态变量不得用于存储与特定请求状态相关的信息。它们可用于在相同操作的请求之间共享全局资源

  • 如果其他资源(JavaBean、会话变量等)需要保护,则必须同步对这些资源的访问。(但是,一般而言,资源类别的设计应在必要时提供其自身的保护

通过派生Struts操作并创建自己的操作来使用Struts操作。在使用Struts操作时,必须注意遵守上述规则。这意味着类似这样的操作是不允许的:

public class MyAction extends Action {
   private Object someInstanceField;
   public ActionForward execute(...) {
      // modify someInstanceField here without proper synchronization ->> BAD
   }
}
你不需要同步动作类,除非你在上面的代码中对它们做了错误的操作。问题是动作的执行入口点是
execute
方法

此方法接收它所需的所有参数。您可以在
execute
方法中同时执行一千个线程,而不会出现任何问题,因为每个线程都有自己的执行堆栈用于方法调用,但不用于堆中的数据(如
someInstanceField
)它在所有线程之间共享

在修改
someInstanceField
时,如果没有适当的同步,所有线程都会随心所欲地使用它

是的,Struts 1 Action类不是线程安全的,但这是因为您不能安全地将状态存储在它们中(即,使它们成为statefulf),或者如果您这样做,它必须正确地同步

但是,如果您保持Action类实现无状态,您就可以了,不需要同步,线程也不会互相等待

为什么struts操作类是singleton

这是经过设计的。JavaDoc再次解释了这一点:

操作是传入HTTP请求的内容与处理该请求时应执行的相应业务逻辑之间的适配器

请求参数绑定到web层,您不希望将该类型的数据发送到业务逻辑类中,因为这将创建紧密耦合 在这两个层之间,这样就不可能轻松地重用您的业务层

因为将web对象转换为模型对象(我不是说这里的ActionFormbean)应该是Action类的主要目的,它们不需要维护任何状态(也不应该),而且,没有理由让这些家伙有更多的实例,它们都在做同样的事情。只要一个就可以了

如果需要,您可以通过将信息持久化到数据库来安全地维护模型中的状态,或者您可以使用http会话来维护web状态。在操作类中维护状态是错误的,因为这引入了如上所述的同步需求

有没有办法从action类中删除singleton

我想您可以扩展Struts并重写的默认行为,以便为每个请求创建一个操作 但这意味着在Struts之上添加另一层来改变它的“正常”行为。我已经在一些应用程序中看到类似的东西变得糟糕,所以我不推荐它

我的建议是让动作类保持无状态,并使用为其创建的单个实例

如果你的应用是新的,你绝对需要状态完整的动作,我想你可以选择Struts 2(他们改变了那里的设计,动作实例现在每个请求一个)。 所以,如果您的应用程序很旧,那么迁移到Struts 2可能会很困难


希望这一点现在能说清楚。

这在Struts2中发生了变化


*Struts 2 Action对象是为每个请求实例化的,因此没有线程安全问题(实际上,servlet容器会为每个请求生成许多丢弃对象,并且多了一个对象不会造成性能损失或影响垃圾收集)。*

谢谢你的建议……我明白了